如何解决纯int位域的签名
6.7.2 / 5中的C标准说:
...是 实现定义了说明符
int
指定与signed int
相同的类型还是指定 与unsigned int
类型相同。
x86-64
ABI在3.1.2中指定:
未签名或未签名的位字段始终具有非负值。尽管它们的类型可能为
char
,short
,int
或long
(可以具有负值),但这些位字段的范围与位字段的范围相同相同大小 带有相应的无符号类型。
因此,在下面的程序中,我希望断言能够通过(至少在Linux上如此)。
#include <assert.h>
struct S {
int x : 3;
};
struct S s;
int main() {
s.x = 6;
assert(s.x == 6);
}
但是它在Clang和Gcc中均失败。为什么?
此外,Clang发出警告:
warning: implicit truncation from 'int' to bit-field changes value from 6 to -2
因此,它的行为就像声明了signed int
位字段一样。如果我明确地将其设置为unsigned int
,则警告消失,并且声明通过。
解决方法
此行为记录在GCC manual中:
将“纯” int位域视为有符号int位域还是无符号int位域(C90 6.5.2,C90 6.5.2.1,C99和C11 6.7.2,C99和C11 6.7.2.1)。
默认情况下,它被视为signed int,但是可以通过-funsigned-bitfields选项更改。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。