判断处理器是Big_endian的还是Little_endian的

Posted 阿玛尼迪迪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了判断处理器是Big_endian的还是Little_endian的相关的知识,希望对你有一定的参考价值。

首先说明一下Little_endian和Big_endian是怎么回事。

Little_endian模式的CPU对操作数的存放方式是从低字节到高字节,而Big_endian模式则是从高字节到低字节,比如32位的数0x12345678在两种模式下的存放如下:

Little_endian:

内存地址      存放内容

0x1000         0x78

0x1001         0x56

0x1002                           0x34

0x1003                           0x12

 

Big_endian:

内存地址      存放内容

0x1000           0x12

0x1001                           0x34

0x1002                           0x56

0x1003                           0x78

 

而联合体的存放顺序是所有成员都从地址值开始存放,于是可以通过联合体来判断。

#include <iostream>
using namespace std;

int CheckCPU()
{
    union
    {
        int a;
        char b;
    }c;
    c.a = 1;
    return (c.b == 1);
}

int main()
{    
    if (CheckCPU())
    {
        cout<<"Little_endian"<<endl;
    }
    else
    {
        cout<<"Big_endian"<<endl;
    }

    return 0;
}

分析:

在联合体中定义了两个成员int和char,而联合体的大小=sizeof(int) = 4,于是在内存中占四个字节的大小,假设占用的内存地址为:0x1000——0x1003,当给a赋值为1时,此时将根据是Little_endian还是Big_endian来决定存放的内存地址。

如果是Little_endian,则

内存地址      存放内容

0x1000        0x01

0x1001                          0x00

0x1002        0x00

0x1003                          0x00

又因为联合体的成员都从低地址存放,于是当取0x1000里面的内容作为b的值,取得的是0x01,即b=1,函数返回值为1,说明处理器是Little_endian。否则,则是Big_endian。

 

转自:http://blog.chinaunix.net/uid-25132162-id-1641532.html

以上是关于判断处理器是Big_endian的还是Little_endian的的主要内容,如果未能解决你的问题,请参考以下文章

Linux 字节序

将 []byte 转为 Little/Big-Endian 有符号整数还是浮点数?

The little prince

推断CPU 是小端存储(Little endian)还是大端存储(Big endian)模式

The Little Prince-12/13

判断机器是big-endianlittle-endian