对于下面这个代码
int main()
{
unsigned int a = -10;
printf("%d\n", a);
printf("%u", a);
}
-10的二级制是 1111 1111 1111 1111 1111 1111 1111 0110
换算成16进制应该是 FF FF FF F6
内存中从左到右是低地址到高地址
按常识FF FF FF F6在内存中应该存的也是FF FF FF F6
但实际我们发现vs存储的方式是低位存在低地址,高位存在高地址,和想象的存储似乎有点出入,为什么会这样呢?
这就是大小端问题
一共有两种数据存储方式:
- 大端
- 小端
大小端概念
按照字节为单位,低权值位数据存储在高地址处,就叫做大端
按照自己饿为单位,低权值位数据存储在低地址处,就叫做小端
比如说这里有个代码:
int a=0x11223344
它的存储方式如下:
0x11223344
记忆口诀:小小小(低权值位,低地址处,小端),否则就是大端(小大大)
所以到这里,我们回去看变量a的存储,可以判断他是大端存储
大小端如何影响数据存储的
大小端的存储方式,本质是数据和空间按照字节为单位的一种映射关系
比如说我们小端存储:
存的过程
对于数据11223344
我们使用小端存储,从低地址到高地址将44 33 22 11存入(16进制为例)
取得过程
- 先看大小端决定怎么取
- 取出来放到对应权值位后,在看空间所属类型(有符号还是无符号,正数还是负数)决定解释方式