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

#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

最新文章

  1. HT for Web基于HTML5的图像操作(三)
  2. Sublime 保存时自动转换tab成空格
  3. GCC:条件判断中赋值语句和函数结尾时无返回值的警告
  4. axure 母版 模板
  5. matlab2014在mac Yosemite下出现java空指针情况
  6. poj2926 曼哈顿最远距离
  7. nRF51822 SDK初体验
  8. iocomp控件的应用
  9. 孙陪你,了解它的权力--Kinect结合的发展Unity3D游戏应用开发
  10. VSCode里的一些有用的插件
  11. Libevent 事件管理和添加事件
  12. 实现PHP内部的通知机制,如当一个类的属性发生变化时,另外一个类就可以收到通知
  13. nnet3 TDNN chunk, left-context, right-context
  14. 链接中 href=&#39;#&#39; 和 href=&#39;###&#39; 的区别
  15. openCV 备忘
  16. json加密
  17. 《算法导论》——MergeSort
  18. Linux命令-xargs
  19. php mysql 计算经纬之间距离 范围内筛选
  20. 传统路径导出 VS 直接路径导出(oracle exp direct=y)

热门文章

  1. CSS学习笔记:浮动属性
  2. Hello World之编译链接装载与执行(1)
  3. 【JavaScript】JS的坚实基础
  4. 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
  5. celery config
  6. spring boot+vue实现H5聊天室客服功能
  7. 基于Netty实现自定义消息通信协议(协议设计及解析应用实战)
  8. GitHub出现Permission denied (publickey)
  9. 手把手教你学Dapr - 7. Actors
  10. 菜鸡的Java笔记 第二十 - java 方法的覆写