有符号位域至少需要两位

时间:2014-05-07 08:43:11

标签: c bit-fields

我有以下结构:

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

Klocwork在int代理处抱怨:1 ...行说:比特字段'代理'有一位并且已签名。签名一位字段CWARN.SIGNEDBIT。

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

Klocwork开发者网站说:

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

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

1 个答案:

答案 0 :(得分:2)

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

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

相关问题