关于大小端的问题

讨论大小端的问题就是在讨论低字节存储在低地址还是高地址的问题

大小端记忆方式:

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的地址&a0x400,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是小端模式还是大端模式了。

猜你喜欢

转载自blog.csdn.net/qq_39736982/article/details/82908832