判断CPU大小端

小端模式,是指数据的低位保存在内存的低地址中,而数据的高位保存在内存的高地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

大端模式,是指数据的低位(就是权值较小的后面那几位)保存在内存的高地址中,而数据的高位,保存在内存的低地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;

32bit宽的数0x12345678的存放方式(假设从地址0x4000开始存放)为:
Little-endian:

内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x78
0x56
0x34
0x12

Big-endian:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x12
0x34
0x56
0x78

存放int 型1的示意图:
Little-endian:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x01
0x00
0x00
0x00

Big-endian:
内存地址
0x4000
0x4001
0x4002
0x4003
存放内容
0x00
0x00
0x00
0x01


方法1


int chkEndian() {
    union Tmp {  
        int a;
        char b;
    } sys;
    sys.a = 1;
    return(sys.b == 1);
}

返回0为大端,返回1为小端。

解释:联合体union的存放顺序是所有成员都从低地址开始存放


方法2:

int x = 0x12345678;

for (int i  = 0; i < 4; i++) {
     printf("0x%x    0x%p\n", *((char*)&x + i),((char*)&x + i));
}

AMD CPU跑的结果:


x86属于小端、ARM默认小端、网络字节序—大端






你可能感兴趣的:(嵌入式)