gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 08:41:10 25 4
gpt4 key购买 nike

我有以下结构:

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/

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