> 文档中心 > C语言数据存储——字节、地址、端序

C语言数据存储——字节、地址、端序

文章目录

  • 高低字节
    • 操作数截断
  • 高低地址
  • 大小端序
    • 内存中使用小端序存储

高低字节

高低字节与内存中的位置无关,描述的是数据中字节的权。例如

int a = 0x00000159;
01 这个字节为高字节,59这个字节为低字节,原因是01所处的位置权较大,而59所处位置的权较小。

简言之,字节从左到右,从高到低

操作数截断

在这里插入图片描述
当把字节多的类型数据赋给一个占字节较少的变量时,会发生截断

就是只保留所能保留的原数据的低字节

如 将int(4字节) 赋给char(1字节),那么数据就只会截断最后的1个字节,高位字节舍去。
在这里插入图片描述

高低地址

内存中,地址从左到右,从低到高

在这里插入图片描述

计算机按照字节寻址,每一个地址指向内存中的一个字节。
在下图中,每一个色块表示内存中的一个字节,箭头处表明了其在内存中的地址。图中地址位32位,说明为32位机器。0x00000000为低地址,0x00000002相对为高地址。
在这里插入图片描述

大小端序

int i = 0x00010002;

下面两幅图分别表示 int i 在内存中的大小端序存储方式。

  • 大端序 big NDN(endian),高字节位于低地址 (从左到右按照顺序摆)
    在这里插入图片描述

  • 小端序 little NDN(endian),低字节位于低地址(逆序摆)
    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来在这里插入图片描述

内存中使用小端序存储

如下一段代码

int main(){    int a = 0x11223344;    char* pa = &a;    *pa = 0; return 0;}
  • 我们先看最初a在内存中如何存放

在这里插入图片描述

整型变量占4个字节,又是按小端序排放,所以是44 33 22 11

  • 执行完*pa = 0;

在这里插入图片描述

44变成了00

因为字符指针解引用只能访问1个字节

我们也可以用代码来验证

int main(){  int a = 1;//0x 01 00 00 00  char* p = (char*)&a;    if(*p == 1)  {    printf("小端序\n");//0x 01 00 00  }  else  {    printf("大端序\n");//0x 00 00 00 01  }  return 0;}