讨论大小端的问题就是在讨论低字节存储在低地址还是高地址的问题
大小端记忆方式:
1、小端模式:低字节存储在低地址上
2、大端模式:低字节存储在高地址上
例题:unsigned int a= 0x1234; unsigned char b=*(unsigned char *)&a
; 在32位大端模式处理器上变量b等于()?
解析:unsigned int a= 0x1234
的32位完全表示是0x00001234
,
由低地址到高地址依次为(假设低地址为0x4000),则其在大端的分布如下:
0x4000 0x4001 0x4002 0x4003
00 00 12 34
则a的地址&a
为0x400
,char类型占一位,因此b的值为:0x00
同理如果是小端则值为:0x34
判断CPU大小端测试代码1.
int checkCPU(void)
{
union
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1);
}
由于union变量的地址和它的各成员的地址都是同一地址,并且union的存放顺序是所有成员都从低地址开始存放的,所以可以利用这两个特点来检测CPU是大端模式还是小端模式。
首先,1的内存地址是:0x00 00 00 01(因为1位整型,占用四个字节,而char只会占用一个字节),其中数据源的高字节是:0x00,低地址处是:01。
如果CPU是小端模式的话,则c.a从低地址处开始存放的就是低字节数据,也就是01,所以 c.b就会被赋值为0x01;
如果是大端模式的话,则c.a从低地址处开始存放的就是高字节数据,也就是0x00,所以c.b就会被赋值为0x00。
这样的话,根据c.b的赋值情况就可以看出CPU是小端模式还是大端模式了。