zoukankan      html  css  js  c++  java
  • 【转】判断处理器是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

  • 相关阅读:
    05.scrapy框架的UA池和代理池
    04scrapy框架的日志等级和请求传参
    03.scrapy框架之递归解析和post请求
    02.scrapy框架持久化存储
    git
    01.scrapy框架简介和基础应用
    将配置文件由Dos存为unix格式
    利用alias命令别名对常用运维命令的调用 (给命令起别名)
    使用LVM方式扩容硬盘空间
    Vi编辑器添加删除多行注释
  • 原文地址:https://www.cnblogs.com/codingmengmeng/p/7845958.html
Copyright © 2011-2022 走看看