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;}