• 【转】判断处理器是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

  • 相关阅读:
    安裝Node.js
    es match、match_phrase、query_string和term的区别
    ES系列十、ES常用查询API
    ElasticSearch 入门总结
    起立,老师好
    像哆啦A梦懂大雄一样懂客户,我们也会拥有百宝箱
    阿里云居然在偷偷发福利!
    别人家的公司又来了,这次竟然开起了演唱会
    听说国家博物馆收藏了一行代码 ???
    我还是那个我,为啥就被老板区别对待了呢?
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/7845958.html
Copyright © 2020-2023  润新知