大小端
CPU有大小端之分,大端是指数据的高位数据保存在低位地址,而低位数据保存在高位地址;小端是指数据的低位数据保存在低位地址,而高位数据保存在高位地址。
那为什么会存在这两种模式?在计算机系统中,是以字节为单位的(8bit),但有些类型的数据,如short
、int
、long
是大于一个字节的,而对于大于8位的处理中,其寄存器宽度大于8位,那么从内存中读取大于一个字节的数据的时候,就会涉及到如何安排这些数据的字节的问题,就产生了大小模两种不同方式。
如两个字节的数据0x1234在大端CPU下存放方式:(假设地址从0x1000开始)
内存地址 | 0x1000 | 0x1001 |
---|---|---|
存放内容 | 0x12 | 0x34 |
而在小端CPU的存放方式:
内存地址 | 0x1000 | 0x1001 |
---|---|---|
存放内容 | 0x34 | 0x12 |
判断大小端
下面是一个C函数,可以用来判断是否是大小端:
bool isLittleEndCPU()
{
int a = 0x1234;
char b = (char) a;
if ((int)b == 0x34)
return true;
else
return false;
}
关键在于char b = (char) a;
这一句,a
从int
强制类型转换为char
,b
得到的是低位地址保存的数据,如果为a
的低位数据0x34
,那么说明是小端模式,反之为大端模式。