试题一:编写一段程序判断系统中的CPU是Little endian还是Big endian模式?
分析:
作为一个计算机相关专业的飞鸽传书,我们应该在计算机组成中都学习过什么叫Little endian和Big endian。Little endian和Big endian是CPU存放数据的两种不同顺序。对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节);而Little endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
例如,假设从内存地址0x0000开始有以下数据:
0x0000
0x0001
0x0002
0x0003
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;
}
除了上述方法(通过指针类型强制转换并对整型数据首字节赋值,判断该赋值赋给了高位还是低位)外,还有没有更好的办法呢?我们知道,union的成员本身就被存放在相同的内存空间(共享内存,正是union发挥作用、做贡献的去处),因此,我们可以将一个CHAR/BYTE数据和一个整型数据同时作为一个union的成员,得出如下答案:
int checkCPU()
{
 {
  union w
  {
   int a;
   char b;
  } c;
  c.a = 1;
  return (c.b == 1);
 }
}
实现同样的功能,我们来看看Linux操作系统中相关的源代码是怎么做的:
static union { char c[4]; unsigned long l; } endian_test = { { 'l', '?', '?', 'b' } };
#define ENDIANNESS ((char)endian_test.l)
Linux的内核作者们仅仅用一个union变量和一个简单的宏定义就实现了一大段代码同样的功能!由以上一段代码我们可以深刻领会到Linux源代码的精妙之处!
试题二:假设网络节点A和网络节点B中的通信协议涉及四类报文,报文格式为“报文类型字段+报文内容的结构体”,四个报文内容的结构体类型分别为STRUCTTYPE1~ STRUCTTYPE4,请编写程序以最简单的方式组织一个统一的报文数据结构。
分析:
报文的格式为“报文类型+报文内容的结构体”,在真实的通信中,每次只能发四类报文中的一种,我们可以将四类报文的结构体组织为一个union(共享一段内存,但每次有效的只是一种),然后和报文类型字段统一组织成一个报文数据结构。
解答:
根据上述分析,我们很自然地得出如下答案:
typedef unsigned char BYTE;
 
//报文内容联合体
typedef union tagPacketContent
{
       STRUCTTYPE1 pkt1;
       STRUCTTYPE2 pkt2;
       STRUCTTYPE3 pkt1;
       STRUCTTYPE4 pkt2;
}PacketContent;
 
//统一的报文数据结构
typedef struct tagPacket
{
       BYTE pktType;
    PacketContent pktContent;
}Packet;
总结
在C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体(试题一是这样的例证);当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n选1”),我们也可以使用联合体来发挥其长处(试题二是这样的例证)。

从两道经典试题谈C/C++中联合体(union)的使用相关推荐

  1. 【笔试题】简单的两道笔试题(1、打印杨辉三角;2、三个数排序)

    笔试题 简单的两道笔试题(1.打印杨辉三角:2.三个数排序) 1.打印杨辉三角 import java.util.Scanner; public class MyYanghuiTriangle {pu ...

  2. Java中创建String的两道面试题及详解

    转载自 Java中创建String的两道面试题及详解 我们知道创建一个String类型的变量一般有以下两种方法: String str1 = "abcd";String str2 ...

  3. 如图两道面试题,顺便深入线程池,并连环17问

    这两面试题是基友朋友最近去面滴滴遇到的,今天就借着这两面试真题来深入一波线程池吧,这篇文章力求把线程池核心点和常问的面试点一网打尽,当然个人能力有限,可能会有遗漏,欢迎留言补充! 先把问题列出来,如果 ...

  4. 两道面试题,带你解析Java类加载机制

    2019独角兽企业重金招聘Python工程师标准>>> 在许多Java面试中,我们经常会看到关于Java类加载机制的考察,例如下面这道题: class Grandpa {static ...

  5. 香港中文大学面试(两道面试题)

    暑假时,坐飞机大老远跑到深圳去面试香港中文大学,本来是信心满满的,到了外面之后才发现希望原本就是无所谓有无所谓无的.才真心体会到了什么叫差距.... 或许你觉得自己发过几篇论文,有丰厚的科研经历,貌似 ...

  6. 在两道多线程基础题“顺序打印”中对比一下Java中的wait()和join()

    目录 一.基础 二.进阶 一.基础 有三个线程,线程名称分别为:a,b,c,每个线程打印自己的名称. 需要让他们同时启动,并按 c,b,a的顺序打印. 这道题要求打印 cba,且只打印一次.如何保证线 ...

  7. 两道JVM面试题,竟让我回忆起了中学时代!

    中学授课模式 考虑到可能有部分粉丝对JVM参数不清楚,所以我们参照中学的授课模式,给大家做一些知识上的普及.理论上,JVM参数主要分为三类 1.标配参数 该类型参数在JDK各个版本之间稳定,很少有大的 ...

  8. 腾讯面试编程题python_腾讯面试官出的 2 道经典数据分析面试题

    没想到这篇文章这么受欢迎,那就再分享一篇:苏克1900:腾讯高级数据分析师:十年分析之路的力荐书籍​zhuanlan.zhihu.com 以下原文章: 近期暑期实习和提前批招聘已经开始了,不论你是校招 ...

  9. ASP.NET 经典60道面试题

    转:http://bbs.chinaunix.net/thread-4065577-1-1.html ASP.NET 经典60道面试题 1. 简述 private. protected. public ...

最新文章

  1. 腾讯 AI Lab 开源业内最大规模多标签图像数据集
  2. 【Timbre,Amplitude,Pitch】声音的基本属性
  3. docker-compos
  4. 第一行代码学习笔记第四章——探究碎片
  5. 浅拷贝与深拷贝的区别
  6. android之phonegap入门
  7. github private链接访问_将github配置为图床+PicGo配置
  8. 分布式事务控制解决方案
  9. 分享几个有趣的Python小项目
  10. java 换行规范_Java代码规范
  11. python简单的购物程序代码打折_Python进阶之路——简单购物代码
  12. 如何在iPhone上将GIF设置为动态壁纸
  13. python实现批量远程电脑传输文件
  14. APP推广前,你应该知道的事
  15. Word论文写作如何实现公式居中、自动编号右对齐
  16. TCP之报文格式解析
  17. 腾讯高级工程师保姆级“Java成长手册”,层层递进,全是精华
  18. WPS文字绿色版下载 WPS Office 2010 中文绿色版
  19. 示波器探头上的×10
  20. [转] 使用memc-nginx和srcache-nginx模块构建高效透明的缓存机制

热门文章

  1. java throws catch_java中throws与try...catch的区别点
  2. B端产品设计——批量导入
  3. 2021年中国高精地图产业研究分析
  4. oracle sqlldr详解,sqlldr详解
  5. 地方政府大数据发展的现实与理想
  6. 【项目管理】项目进度管理的关键路径
  7. 【Python】Turtle绘制科赫雪花
  8. 浮点高精求和(洛谷P2393题题解,弃坑Java拥抱C++)
  9. 小猿圈python学习-函数的递归
  10. 大数据利器2018版