前两天做阿里笔试遇到一个选择题题目大概是
#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 = 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
浙公网安备 33010602011771号