Advertisement

一道关于位段及大小端的面试题

阅读量:

输出下面这一道题的输出:

复制代码
    struct mybitfields
    {
    unsigned short a : 4;
    unsigned short b : 5;
    unsigned short c : 7;
    } test
    
    void main(void)
    {
    int i;
    test.a = 2;
    test.b = 3;
    test.c = 0;
    i = *((short *)&test);
    printf("%d\n", i);
    }
    
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
      
    
    代码解释

这道题的第一步首先要明确冒号的作用它相当于给每个变量分配一定的字节数。因此我们可以确定每个成员对应的内存占用分别为:a占用4个字节b占用5个字节c占用7个字节总计16个字节即两个字节。

首先我们要清楚存储方式是这样的:

这里写图片描述

必须考虑到我们在这种情况下采用了小端字节序的方式,并从(\texttt{short}) \& \texttt{test}中提取了两个字节内容以获取相关信息。其含义是通过从\texttt{test}地址处读取两个相邻的字节来完成这一操作。最终执行的结果:

这里写图片描述

全部评论 (0)

还没有任何评论哟~