大端存储模式和小端存储模式
前言
对于整型来说:数据存放在内存中其实存放的是补码(深度剖析数据在内存中的存储:https://blog.csdn.net/Outtch_/article/details/102758413)
我们可以看到对于整型a和b分别存储的是补码,但是我们发现顺序有点不对劲,有一种数据好像存反的错觉,这又是为什么呢?
这就和我们今天讨论的主题——大端存储模式和小端存储模式有着密切的关系。
什么是大小端
数据的高低位: 高位————低位
内存的高低位: 低地址————高地址
- 大端存储模式(低存高 高存低):
指数据的低位保存在内存的高地址当中,而数据的高位保存在内存的低地址当中。
- 小端存储模式(低存低 高存高):
指数据的低位保存在内存的低地址当中,而数据的高位保存在内存的高地址当中。
为什么会有大小端
为什么会有大端存储模式和小端存储模式之分呢?
计算机系统中内存是以字节为单位进行编址的,每个地址单元都唯一的对应着1个字节(8 bit)。
这可以应对char类型数据的存储要求,因为char类型长度刚好是1个字节,但是有些类型的长度是超过1个字节的(字符串虽然是多字节的,但它本质是由一个个char类型组成的类似数组的结构而已),比如C/C++中,short类型一般是2个字节,int类型一般4个字节等。
因此这里就存在着一个如何安排多个字节数据中各字节存放顺序的问题。正是因为不同的安排顺序导致了大端存储模式和小端存储模式的存在。
大小端的优缺点
为什么截然相反的大小端存储模式能够并存至今?在标准化备受推崇的今天,为什么大小端谁都没有被另外一个所同化?我想这除了历史的惯性使然,还与它们各自的优缺点有关。
- 大端存储模式的优点
1.符号位在所表示的数据的内存的第一个字节中,便于快速判断数据的正负和大小
- 小端存储模式的优点
1.CPU做数值运算时从内存中按顺序依次从低位到高位取数据进行运算,直到最后刷新最高位的符号位,这样的运算方式会更高效
2.内存的低地址处存放低字节,所以在强制转换数据时不需要调整字节的内容
判断当前主机的字节序
方法一:类型强转
int check(){
int key = 1;
return (char)key;
}
int main(){
int ret = check();
if (ret == 1)
printf("小端机");
else
printf("大端机");
return 0;
}
方法二:联合
int check(){
union {
int key;
char ret;
}un;
un.key = 1;
return un.ret;
}
int main(){
int ret = check();
if (ret == 1)
printf("小端机");
else
printf("大端机");
return 0;
}
解析:
整型key的值为1,二进制序列为00000000 00000000 00000000 00000001,十六进制序列为00 00 00 01
不论是强转还是联合,都是截断低位的一个字节
在小端机中截断为 01、在大端机中截断为 00