首页 > 其他分享 >【计算机组成】大端与小端

【计算机组成】大端与小端

时间:2023-07-11 16:44:12浏览次数:34  
标签:小端 存储 计算机 long 地址 大端 ptr 字节

在计算机系统中,内存的每一个字节都被赋予地址值作为唯一标识。

对于一个字节来说,它的最低有效位(LSB, Least Significant Bit)位于二进制最右边,而最高有效位(MSB, Most Significant Bit)位于二进制最左边。这一点对于所有的计算机系统架构都是一致的。即如果用一个字节存储十进制数13,字节的值为0b00001101

然而,更多的数据类型的大小不止一个字节。比如,c语言中long占4个字节。这时如果我用一个long *指针指向一个long类型的变量,实际上是指向两个字节中地址值较低的那个。这一点可以通过如下代码印证:

// seeBytesOfLong.c
int main() {
        long num = 0x12345678;
        long* long_ptr = #
        unsigned char* ptr = (unsigned char*) long_ptr;
        for(int i = 0; i < 4; i++) {
                printf("%p\n", ptr);
                ptr++;
        }
        return 0;
}

执行结果如下:

这时就出现了一个问题,用这样的由多个字节组成的类型来存储值时,值的高位存放在低地址字节,还是高地址字节呢?这两种方案实际都是可行的,这也就是所说的大端与小端。

大端与小端指的就是数据的存储方式。具体而言,大端指的是将高位数据字节存放在低地址处,而小端指的是将高位数据字节存放在高地址处。

也就是说,如果我用long型存储0x12345678,那么在大端的模式下,地址由低到高四个字节存储的值分别为0x12, 0x34, 0x56, 0x78,而小端模式下,存储的值会反过来,依次为0x78, 0x56, 0x34, 0x12

实际的存储方式为小端还是大端呢?这取决于计算机架构,即由硬件决定。

对于x86_64架构,其采取的数据存储方式是小端方式。基于验证long型字节地址顺序的代码略作改动即可印证:

// seeBytesOfLong.c
#include<stdio.h>

int main() {
        long num = 0x12345678;
        long* long_ptr = &num;
        unsigned char* ptr = (unsigned char*) long_ptr;
        for(int i = 0; i < 4; i++) {
                printf("%p: %x\n", ptr, *ptr);
                ptr++;
        }
        return 0;
}

执行后,输出如下:

可以看到,低位数据字节确实位于低地址。

标签:小端,存储,计算机,long,地址,大端,ptr,字节
From: https://www.cnblogs.com/hsjia/p/17545061.html

相关文章

  • 计算机cpu的多级缓存简单原理
    缓存级别L1高速缓存(最快内存),一般分为两种方式:指令缓存和数据缓存;一般大小在256KB~1MB之间。L2叫L1缓存慢,比L1会更大些,一般大小在256KB~8MB之间。L3最大的高速缓存存储单元,也是最慢的一个。它的范围从4MB到50MB以上。数据会从RAM依次流到L3高速缓存,然后是L2,最后是L1查找时,会......
  • Windows计算机如何在线打开Sketch文件?
    自Sketch诞生以来,只有Mac版本。Windows计算机如何在线打开Sketch文件?即时设计已经解决了你遇到的大部分问题,不占用内存也是免费的。您可以使用此软件直接在线打开Sketch文件,完整预览并导出CSS、SVG、PNG等,还具有编辑功能! 如何导入Sketch文件?如果需要切换设计工具,能够......
  • 计算机网络自顶而下第一章笔记记录
    计算机网络节点主机及其上运行的应用程序(能接入互联网的任何终端)(端点)路由器,交换机等网络交换设备。(其中,路由器与交换机的工作层次不同,路由器在网络层工作,交换机在链路层工作)边 通信链路(按接入设备的不同)接入网链路,主机连接到互联网的链路(只要有端点即可)主干链路:路由器......
  • 计算机病毒
    #include<iostream>usingnamespacestd;intmain(intargc,char**argv){ intn; cin>>n; chara[100][100]; charb[100][100]; intm; for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++){ cin>>a[i][j]; b[i][j]=a[i][j]; } }......
  • 计算机病毒
    #include<bits/stdc++.h>usingnamespacestd;intmain(intargc,char**argv){ intn,m,ge=0,sum=0; chara[100][100]; cin>>n; for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++){ cin>>a[i][j]; } } cin>>m; for(intl=1;......
  • 计算机病毒
    #include<iostream>usingnamespacestd;intmain(){intn,m,sum=0;cin>>n;chara[n+1][n+1];for(inti=1;i<=n;i++){for(intj=1;j<=n;j++){cin>>a[i][j];}}cin>>m;......
  • 计算机病毒
     #include<iostream>usingnamespacestd;intmain(intargc,char**argv){ intn; cin>>n; intm,c=0; chara[101][101]; intb[n][n]; for(inti=1;i<=n;i++){ for(intj=1;j<=n;j++){ cin>>a[j][i];// if(a[j][i]=='@&#......
  • 计算机病毒
    #include<iostream>usingnamespacestd;intmain(intargc,char**argv){ intn,m,x=0; cin>>n; chara[100][100]; intb[100][100]; for(intj=1;j<=n;j++){ for(inti=1;i<=n;i++){ cin>>a[j][i]; } } cin>>m; for(int......
  • OpenCV计算机视觉学习(14)——浅谈常见图像后缀(png, jpg, bmp)的区别(opencv读取语义分割m
    如果需要处理的原图及代码,请移步小编的GitHub地址传送门:请点击我如果点击有误:https://github.com/LeBron-Jian/ComputerVisionPractice 本来不想碎碎念,但是我已经在图像后缀上栽倒两次了。而且因为无意犯错,根本找不到问题。不论是在深度学习的语义分割中,还是在图......
  • 简易计算机
    <!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport"content="width=devic......