gpt4 book ai didi

c - 位域声明中的整数宽度是否相关?

转载 作者:行者123 更新时间:2023-12-02 22:44:14 33 4
gpt4 key购买 nike

我在找一个我不应该写的理由

struct bitfield {
signed foo:4;
unsigned bar:2;
};

而不是冗长地指定

struct bitfield {
signed int foo:4;
unsigned int bar:2;
};

由于位域的每个成员的大小都是在冒号之后明确指定的,有什么缺点吗?

我使用 charshortlonglong long 有关系吗?指定位域的位数是否必须总是小于声明类型的宽度?


找到一些相关问题:

答案范围从

  • 不要使用除 (signed/unsigned) int_Bool
  • 以外的任何其他类型
  • _Boolsigned intunsigned int 或其他实现定义的类型。 (C99 6.2.7.1 (4) )

在这种情况下:这个不特定的一些其他实现定义的类型可能是什么样的,我在这个地方的选择可能会带来什么其他缺点?

最佳答案

“有时”和"is"

C99 要求宽度表达式“不超过指定类型对象中的位数”,因此如果使用太小的类型,代码将无法编译或在至少不可携带。参见 §6.7.2.1 (3)。

关于更新后的第三个问题和一般性问题,“究竟有什么后果?” 问题,可能受到影响的是:可移植性、对齐和填充。该标准仅对第一个给出了明确的规范。如果没有位域,通常可能会根据预测编译器将如何生成最佳对齐值来安排对齐和填充。虽然不能保证,但在某些环境中使用类似 short 的东西似乎会节省内存,因为这会减少对齐和填充。

实现精确布局和可移植性偶尔相互冲突的目标的一种可能方法是声明没有位字段的内存数据结构,可能使用 <stdint.h>类型。然后,如果您想使用位域来解码某些内容,请将内存中的源对象分配给一个临时变量,该变量是位域和位特定类型的 union ,或者故意通过强制转换来违反类型双关规则指针。 (Linux 无处不在。)

更好的方法可能是避免使用位字段。

关于c - 位域声明中的整数宽度是否相关?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10271265/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com