【问题标题】:structure padding with bit fields使用位域填充结构
【发布时间】:2014-07-01 16:27:29
【问题描述】:

我想做一个36位的结构所以我尝试了下面的结构

#pragma pack(push, 1)
 struct{

    unsigned int a : 5;
    unsigned int b : 1;
    unsigned int c : 11;
    unsigned int d : 2;
    unsigned int e : 2;
    unsigned int f : 1;

    unsigned int g : 8;
   unsigned int h : 6;

}HDR;
#pragma pack(pop)

sizeof(HDR): 5, 8*5 = 40 bits,我试过 unsigned short 仍然是 40 bits。

但我只想使用 36 位。

有什么办法可以做到吗?

谢谢

【问题讨论】:

  • 有什么理由不能使用unsigned char HDR[36] 之类的东西吗?还要记住 int 的大小在不同的编译器和平台之间是不一样的。
  • 这段代码在为<stdint.h>标头尖叫
  • 如果我使用 unsigned char HDR[36] 那就是 36 字节的权利但是我需要 36 位的位域
  • 除非您使用的是具有 36 位字长的机器,否则您将无法获得 36 位,而这与现在的情况相去甚远。总大小将始终是整数字节,因此位将始终是 CHAR_BITS 的倍数(在您的机器上可能是 8)。
  • 您可能还真的想小心订购。根据您正在编译的机器,字节顺序可能会成为一个问题,当然取决于您的使用模型。我通常将位字段用于应该直接读写硬件寄存器的嵌入式系统。在这些情况下,您真的必须注意位和字节顺序!!!

标签: c structure padding


【解决方案1】:

对象的大小始终是sizeof(char) 的倍数。在大多数平台上,char 包含 8 位。要容纳36 位,您将需要一个大小等于5*sizeof(char) 的对象,您会得到40 位。

您将需要一个大小为5 的对象来保存33 - 40 位。

【讨论】:

  • sizeof(char) 的定义是 1。说对象大小总是 1 的倍数并不是很有用:)。大小将是CHAR_BIT 的倍数(在limits.h 中定义)。
【解决方案2】:

许多机器的最小尺寸为 8 位,因此您无法以任何方式达到 36 位。总会有打包位使其达到 8 位或 16 位或 32 位边界。

【讨论】:

    猜你喜欢
    • 2018-05-11
    • 1970-01-01
    • 2017-08-26
    • 2021-03-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-13
    • 1970-01-01
    相关资源
    最近更新 更多