为什么用结合包装结构?

时间:2015-06-30 00:39:36

标签: c struct

我看到了Is it possible to insert three numbers into 2 bytes variable?

的好答案的代码段
  

例如,我想存储包含天,月,年的日期。

     
      
  • 天 - > 31,月份 - > 12,年 - > 99
  •   
     

我想将311299存储在一个变量中,并使用移位运算符<<>>来操纵它。

//Quoted: the C code from that answer
    union mydate_struct {
        struct {
            uint16_t day : 5;    // 0 - 31
            uint16_t month : 4;  // 0 - 12
            uint16_t year : 7;   // 0 - 127
        };
        uint16_t date_field;
    };

现在,我的问题是为什么用结合包装结构?除了记忆相关的问题有什么特别的好处?
PS: 我知道使用union确保内存大小的一些典型用法。

因为如果只是使用struct,它似乎更直接,更简单:

   typedef struct {
        uint16_t day : 5;    // 0 - 31
        uint16_t month : 4;  // 0 - 12
        uint16_t year : 7;   // 0 - 127
   } mydate_struct;

更新1:

关于在这里包装工会的好处的一些结论:

  • 可以同时启动年,月,日
  

使用union的优点是给union my_datestruct u;   你可以写u.date_field = 0x3456;并初始化年,月   和白天同时进行。它由实现定义   这是做什么的,不同的实现可以定义它   不同。这年的年份将是0x56,这是一个微不足道的机会   月0x08,和第0x06天(又名86-08-06 - 世纪不清楚   所定义);这也是年度将是0x1A的适度机会   月0x02,和第0x1A天(又名26-02-26 - 世纪仍然不清楚   定义)。人们已经忘记了Y2K。 ---- @Jonathan Leffler的评论

  • 您可以一次读/写整个数字。(---- @StenSoft的评论

2 个答案:

答案 0 :(得分:4)

union表示其中的每个部分都将使用相同的内存,因此您可以使用第一个第二个部分(可以是完全不同的内容)。在您的情况下,它是整个结构或uint16_t date_field

在链接问题的上下文中,编写者打算使用它将具有两个字节大小的结构转换为两个字节的整数,反之亦然。将某些内容分配给struct并从同一内存中读取int值。但这在C ++中是不允许的,可能不起作用(多种原因......)。不可能在任何部分之间随意切换。

答案 1 :(得分:1)

Union将在成员变量之间共享内存。因此,union的大小将是其成员变量的最大元素的大小。这就是struct在变量uint16_t date_field;

中包含在union中的原因

因此,用户可以使用16位内存作为结构或变量date_field来保存数据。