【问题标题】:How to make a data type smaller than 32 bits如何使数据类型小于 32 位
【发布时间】:2013-10-02 15:41:05
【问题描述】:

好吧,我已经创建了一个位字段

typedef struct 
{
    unsigned bit : 1;
}BIT;

并且 sizeof 运算符返回 4...ergo 说 struct 并不是真的有点,而是 32。有没有办法强制 c 结构低于所述值?这一切都依赖于系统吗? (我的书说一个 char 只有 1 个字节,而对我来说 sizeof(char) 返回 4...)

【问题讨论】:

  • 我怀疑你的 'sizeof(char)' 返回 4。
  • 可能你有sizeof('a') 或返回4。C 中的字符常量不是char 类型,而是int 类型。
  • @hacks,不,不,不。 sizeof定义返回对象中char 的数量,因此sizeof(char) 始终为1。如果你的编译器告诉你一些不同的东西,它肯定不是C 编译器。
  • @hacks:根据定义,类型char 的大小为1;宏 CHAR_BITS 告诉您单个 char 中有多少位(至少 8 个,但可能更多)。 char 值是否映射到目标平台上的单个字节取决于实现。例如,一种旧的体系结构(PDP?)使用 36 位字,它可以保存 5 个 7 位字符值,剩下一位。将char 值映射到该架构将是一项挑战。
  • @hacks 在 C 中,“字节”不一定是 8 位,而是“数据存储的可寻址单元,大到足以容纳执行环境的基本字符集的任何成员”。它也必须 >= 8 位。 IWO,char。所以char 的大小始终为 1。在此 C 语言定义之外,“字节”现在在很大程度上被理解为 8 位(并非总是如此)。所以char 可能是 2 个“C 定义之外”字节。

标签: c memory byte sizeof bit


【解决方案1】:

N1570:

6.7.2.1 结构和联合说明符
...
11 实现可以分配任何大到足以容纳位域的可寻址存储单元。 如果有足够的空间,一个位域紧跟在另一个位域之后 结构应打包到同一单元的相邻位中。如果剩余空间不足, 不适合的位域是否放入下一个单元或与相邻单元重叠是 实现定义。一个单元内位域的分配顺序(高位到 低阶或低阶到高阶)是实现定义的。对齐方式 未指定可寻址存储单元。

您的实现显然分配了一个 32 位 unsigned int 来包含位字段。检查你的编译器文档,看看是否有办法强制它为位域使用更小的类型,尽管我不会屏住呼吸。

【讨论】:

  • 所以...基本上我的计算机正在将 unsigned int 的内存大小分配给 unsigned?如果是这样...那是有道理的,谢谢。我正在使用 gcc
  • @user2646981, unsigned int 与来自 C 的 unsigned 相同。
【解决方案2】:

您可以尝试将unsigned charshort 用于结构,但也存在对齐问题。

【讨论】:

  • 这就是为什么我试图将其定义为一种类型而不是使用现有类型
【解决方案3】:

标准保证sizeof(char)返回1

对于您的BIT 结构:无法定义需要少于 1 字节内存的数据类型。

对于位域(: 说明符),如果您真的真的必须以所有可能的方式节省一些内存,那么您可能很幸运能够执行以下操作:

typedef struct 
{
    char c1 : 4;
    char c2 : 4;
} MyPackedByte;

这将允许您在一个字节内存储两个 4 位值,但这种行为可能是编译器特定的,也许您将不得不使用一些预处理器指令,例如 #pragma pack

见:#pragma pack effect

【讨论】:

  • 这真是太好了!谢谢。当我尝试 pragma pack(1) 并告诉主函数返回 sizeof(BIT)...它返回 1!
【解决方案4】:

如果你只需要 1 位,为什么还要有一个结构?最小的存储单位是一个字节(通常是 1 个字符);为什么不 typedef BIT 是一个字符?

【讨论】:

  • 这只是一个好奇的实验。如果我有非常少量的存储空间来处理它,而我需要的只是一个布尔值……为什么我只需要 1 位而浪费 8 位?
【解决方案5】:

您不应该对位域使用 sizeof() 函数。你是你如何“切割”你的 int 的一个设置,如果你以后真的需要得到它的大小,也许你可以将它存储在某个地方? 就像是 类型定义结构 { ``无符号位:1,位2:3;

``size_t size_bit1, size_bit2; }位;

void initBIT() {
size_bit1 = 1; size_bit2 = 3; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 1970-01-01
    • 2018-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多