c - 带符号的位域至少需要两位

标签 c bit-fields

我有以下结构:

struct holder {
  int cause;
  int agent:1, group:1, supervisor:1, defer:1;
};

Klocwork 在 int agent:1 ... 行中提示:位字段“agent”有一位并且已签名。带符号的一位字段,CWARN.SIGNEDBIT。

我不明白为什么被签名的整数会有什么不同。我意识到对于带符号的整数,最左边(最高有效位)的位用于确定整数是正数还是负数,但是对于位域肯定无关紧要???

Klocwork 开发者网站说:

有符号位域至少需要两位,该域的两个可能值是 -1 和 0。虽然检查 1 位有符号位域是否为 0 是安全的,将其用作 bool 标志,但其他算术运算可能会产生意想不到的结果。

有人可以解释为什么在这种情况下整数必须是无符号的吗?

最佳答案

如果您将该值用作标志,则将其存储为无符号更符合逻辑,因为正常表达式将是 1 和 0,而不是 -1 和 0。如果为真,C 中的逻辑表达式也会返回 1,而不是 -1

另一个问题是,如果您使用带符号的位字段,可能需要更多的指令来对值进行符号扩展,而不是仅仅屏蔽掉不需要的位。

关于c - 带符号的位域至少需要两位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23512927/

相关文章:

C计算字符串中某个字符出现的次数

c - gcc pack-struct 会决定向结构中添加多少填充吗?

c++ - C++结构位字段无法正确解析数据

c - 使用 for 循环的结构位域数据操作

c++ - 用于有序组合生成和排名的库?

C:指向指针地址的指针,需要说明

c - 在头部被删除并重新创建后创建列表的第二个元素时出错

c - 循环结束条件不起作用 - C

C++ boolean 数组作为位域?

c - _int64 位域