为什么 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}
。所以设置 1
为 a
将代表一个值 -1
.
附录:
请注意,根据 C90
标准,普通 int
是 signed 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
我期待输出 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}
。所以设置 1
为 a
将代表一个值 -1
.
附录:
请注意,根据 C90
标准,普通 int
是 signed 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