字节序,大小端问题
我们都知道一个字节等于8个比特,而一个比特只能存放一个0或者一个1,因此一个字节最大能存储的数字为 11111111(255)。那么当我们要存储 65530 这种需要多字节内容时,就会出现两种情况:
内存中的多字节数据相对于内存地址有大端和小端之分。
- 大端字节序:高地址存低位
- 小端字节序:低地址存低位
假设我们要将0x1234abcd存入以0x0000开头的内存中,
big-endian大端 | little-endian 小端 | |
---|---|---|
0x0000 | 0x12 | 0xcd |
0x0001 | 0x34 | 0xab |
0x0002 | 0xab | 0x34 |
0x0003 | 0xcd | 0x12 |
为什么会有大端字节序和小端字节序?
- 计算机电路处理低字节序,效率比较高,因为计算都是从低位开始的
- 人类习惯读写大端字节序,所以除了计算机内存处理,其他场合几乎都是大端字节序,比如:网络传输和文件存储。
如何判断电脑是大端还是小端?
int main()
{
int a = 1;
if( 1== ((char *)&a)[0]){
printf("小端字节序\n");
}
else if( 0== ((char *)&a)[0]){
printf("大端字节序\n");
}
return 0;
}