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

#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

C++中union相关的更多相关文章

  1. 理解CSV文件以及ABAP中的相关操作

    在很多ABAP开发中,我们使用CSV文件,有时候,关于CSV文件本身的一些问题使人迷惑.它仅仅是一种被逗号分割的文本文档吗? 让我们先来看看接下来可能要处理的几个相关组件的词汇的语义. Separat ...

  2. Spring Framework------>version4.3.5.RELAESE----->Reference Documentation学习心得----->Spring Framework中web相关的知识(概述)

    Spring Framework中web相关的知识 1.概述: 参考资料:官网documentation中第22小节内容 关于spring web mvc:  spring framework中拥有自 ...

  3. storm-kafka组件中KafkaOffsetMetric相关统计指标说明

    storm-kafka组件中KafkaOffsetMetric相关统计指标说明 storm-kafka是storm提供的一个读取kakfa的组件,用于从kafka队列中消费数据.KafkaOffset ...

  4. Linux中mod相关的命令 内核模块化 mod相关命令都是用来动态加载内核模块/驱动程序模块

    Linux中mod相关的命令 内核模块化   mod相关命令都是用来动态加载内核模块/驱动程序模块 http://baike.baidu.com/link?url=lxiKxFvYm-UfJIxMjz ...

  5. 补充:sql server 中的相关查询、case函数

    相关查询(在同一个表中) 相关查询类似子查询,但是又不同于子查询:子查询中的子条件可以单独查出数据,但是相关查询的子条件不能查处数据.(可以理解成C#中for的穷举法,第一个for走一个,第二个for ...

  6. c语言中数组相关问题

    c语言中数组相关问题: 1.数组基本定义: 相同数据类型的元素按一定顺序排列的集合,就是把有限个类型相同的变量用一个名字命名,然后用编号区分他们的变量的集合,这个名字称为数组名,编号称为下标.组成数组 ...

  7. 【Socket编程】Java中网络相关API的应用

    Java中网络相关API的应用 一.InetAddress类 InetAddress类用于标识网络上的硬件资源,表示互联网协议(IP)地址. InetAddress类没有构造方法,所以不能直接new出 ...

  8. Oracle中Union与Union All的区别(适用多个数据库)

    Oracle中Union与Union All的区别(适用多个数据库) 如果我们需要将两个select语句的结果作为一个整体显示出来,我们就需要用到union或者union all关键字.union(或 ...

  9. MySQL中union和order by一起使用的方法

    MySQL中union和order by是可以一起使用的,但是在使用中需要注意一些小问题,下面通过例子来说明.首先看下面的t1表. 1.如果直接用如下sql语句是会报错:Incorrect usage ...

随机推荐

  1. bootstrap 4 学习笔记

    一.button 颜色类 白色:btn 浅蓝色:btn btn-primary 深蓝色:btn btn-info 绿色:btn btn-success 黄色:btn btn-warning 红色:bt ...

  2. Ubuntu安装数据库

    1.通过命令行安装:sudo apt-get install mysql-client mysql-server 2.安装过程中输入数据库密码("123456",root) 3.使 ...

  3. loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852?

    loto仪器_如何模拟输出凸轮轴和曲轴波形_用任意波形信号源SIG852? 在汽车传感器的波形检测应用中,有时候需要模拟各种汽车传感器的输出信号,用来驱动和监测对应的执行机构或者电路是否正常,这其中, ...

  4. 匿名函数托管器 spring-boot-func-starter

    spring-boot-func-starter spring-boot-func-starter 介绍 项目地址: https://gitee.com/yiur/spring-boot-func-s ...

  5. google-chrome 启动报错 nss_util.cc(627)] NSS_VersionCheck("3.26") failed. NSS >= 3.26 is required

    一.错误情况 报错如下: [0807/144244.712736:FATAL:nss_util.cc(627)] NSS_VersionCheck("3.26") failed. ...

  6. 使用grep命令,玩转代码审计寻找Sink

    好久没分享东西了,今天分享个实用代码审计技巧 使用grep,玩转代码审计,适用于linux/mac,windows需要另行安装grep: 使用场景如下:快速寻找项目中所有的Sink,快速寻找符合适配条 ...

  7. tabulate

    ValueError: headers for a list of dicts is not a dict or a keyword from: https://bitbucket.org/astan ...

  8. Linux基础二:文件系统

    二.文件系统: Linux系统一切皆文件!整个文件系统是一棵颠倒过来的树形结构,根目录/在顶部,且从根目录到下面的任一文件有且仅有一条路径. 1.重要目录: /usr -> 存放普通用户命令(/ ...

  9. [loj150]挑战多项式

    以NTT为运算基础,即默认支持在$o(n\log n)$的时间内多项式乘法 二次剩余:称$n$为模$p$意义下的二次剩余,当且仅当存在$x$使得$x^{2}\equiv n(mod\ p)$ 当$p$ ...

  10. [luogu4747]Intrinsic Interval

    有一个结论,答案一定是所有包含其合法区间中$l$最大且$r$最小的 证明比较容易,考虑两个合法区间有交,那么交必然合法,同时交也必然包含该区间,因此这个区间一定是合法的(取$l$最大的和$r$最小的两 ...