FlyingCode

导航

 

前两天做阿里笔试遇到一个选择题题目大概是

#include <iostream>
#include <stdlib.h>
using namespace std;

union {
    int array[2];
    char str[8];

} u1;
union {
    uint32_t array[3];
    char str[10];

} u2;
int main() {
    for (int i = 0; i < 8; ++i)
        u1.str[i] = i;
    cout << u1.array[0] % 65536 << endl;
    //256
    cout<<"u1.array:"<<endl;
    for(auto i:u1.array) cout<<i<<" ";
    cout<<endl;
    for (int i = 0; i < 10; ++i)
        u2.str[i] = i;
    cout << u2.array[2] % 65536 << endl;
    //2312
    cout<<"u2.array:"<<endl;
    for(auto i:u2.array) cout<<i<<" ";
    cout<<endl;
    return 0;

(我做了点补充)

结果:

参考了博客:http://blog.csdn.net/gao1440156051/article/details/51089984终于搞清楚了是怎么回事

 在小端序的机器中,如果

union X{
    int x;
    char y[4];
};

如果: 
X a; 
a.x=0x11223344;//16 进制 则:

a.y[0]=11 

a.y[1]=22 

a.y[2]=33 

a.y[3]=44

 

试题一:编写一段程序判断系统中的CPU 是Little endian 还是Big endian 模式? 
分析: 
作 为一个计算机相关专业的人,我们应该在计算机组成中都学习过什么叫Little endian 和Big endian。Little endian 和Big endian 是CPU 存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian 认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian 则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。 
例如,假设从内存地址0x0000 开始有以下数据: 
0x12 0x34 0xab 0xcd 
如 果我们去读取一个地址为0x0000 的四个字节变量,若字节序为big-endian,则读出结果为0x1234abcd;若字节序位little-endian,则读出结果为 0xcdab3412。如果我们将0x1234abcd 写入到以0x0000 开始的内存中,则Little endian 和Big endian 模式的存放结果如下: 
地址 0x0000 0x0001 0x0002 0x0003 
big-endian 0x12 0x34 0xab 0xcd 
little-endian 0xcd 0xab 0x34 0x12 
一般来说,x86 系列CPU 都是little-endian 的字节序,PowerPC 通常是Big endian,还有的CPU 能通过跳线来设置CPU 工作于Little endian 还是Big endian 模式。 
解答: 
显然,解答这个问题的方法只能是将一个字节(CHAR/BYTE 类型)的数据和一个整型数据存放于同样的内存 
开始地址,通过读取整型数据,分析CHAR/BYTE 数据在整型数据的高位还是低位来判断CPU 工作于Little 
endian 还是Big endian 模式。得出如下的答案:

typedef unsigned char BYTE;
int main(int argc, char* argv[])
{
    unsigned int num,*p;
    p = &num;
    num = 0;
    *(BYTE *)p = 0xff;
    if(num == 0xff)
    {
        printf("The endian of cpu is little\n");

    }
    else //num == 0xff000000
    {
        printf("The endian of cpu is big\n");

    }
    return 0;

}

如图

  • 如果是大端存储,则num==0xff000000;
  • 如果是小端存储,则num==0x000000ff;

 

看完上述内容以后答案就很明朗了,u1.array[0]的内容变成了0x03020100

十六进制转换为十进制以后正好是50462976

 

posted on 2017-08-28 17:20  hhbeast  阅读(231)  评论(0)    收藏  举报