为什么 C 中的以下代码打印 -1?

Why the following code in C prints -1?

我期待输出 1..

#include<stdio.h>
int main(){
struct A{
    int a:1;
};
struct A bb;
bb.a=1;
printf("%d",bb.a);
return 0;
}

通过执行 int a:1,您将 a 设置为 1 bit signed int。它由 1 位表示,假设在您的实现中使用二进制补码表示,它的范围为 {0,-1}。所以设置 1a 将代表一个值 -1.

附录:

请注意,根据 C90 标准,普通 intsigned int;但是当涉及到位域时,以下内容成立:

A bit-field may have type int , unsigned int , or signed int . Whether the high-order bit position of a plain int bit-field is treated as a sign bit is implementation-defined

您的位域是一个大小为 1 的带符号整数。一位的唯一有效带符号值是 0 (0) 和 -1 (1),因为最重要的 (并且只有) 位被认为是符号位。

如果考虑两位值,你会看得更清楚:0(00), 1(01), -1(11), -2( 10).

换成unsigned int a:1就可以达到你的预期了

二进制补码机上的 1 位有符号字段只能取值 0 或 -1,在这里找到 http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html