我有以下结构:
struct holder {
int cause;
int agent:1, group:1, supervisor:1, defer:1;
};
Klocwork在int代理处抱怨:1 ...行说:比特字段'代理'有一位并且已签名。签名一位字段CWARN.SIGNEDBIT。
我不明白为什么签名的整数会有所不同。我意识到,对于有符号整数,最左边(最高有效)位用于确定整数是正还是负,但在位字段的情况下肯定无关紧要???
Klocwork开发者网站说:
有符号位域至少需要两位,并且该字段的两个可能值为-1和0.虽然将1位有符号位域检查为0是安全的,但将其用作布尔标志,其他算术运算可能会产生意想不到的结果。
有人可以解释为什么在这种情况下整数必须是无符号的吗?
答案 0 :(得分:2)
如果将该值用作标志,则将其存储为无符号更合乎逻辑,因为正则表达式将为1和0,而不是-1和0.如果为真,则C中的逻辑表达式也返回1,而不是-1
另一个问题是,如果使用有符号位字段,可能需要更多指令来对值进行扩展而不是仅仅屏蔽掉不需要的位。