我有以下结构:
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/