我期待1作为输出..
#include<stdio.h>
int main(){
struct A{
int a:1;
};
struct A bb;
bb.a=1;
printf("%d",bb.a);
return 0;
}
答案 0 :(得分:9)
通过执行int a:1
,您将a
设为1 bit signed int
。它由1位表示,并假设您的实现中有两个补码表示,它的范围为{0,-1}
。因此,将1
设置为a
将代表值-1
。
<强>附录强>:
请注意,按C90
标准,普通int
为signed int
;但是当涉及到位字段时,以下情况属实:
位字段可以具有int,unsigned int或signed int类型。普通
int
位字段的高位位置是否被视为符号位是实现定义的
答案 1 :(得分:2)
二进制补码机上的1位有符号字段只能取值0或-1,在此处找到它 http://publications.gbdirect.co.uk/c_book/chapter6/bitfields.html
答案 2 :(得分:1)
您的位字段是大小为1的有符号整数。一位的唯一有效有符号值是0(0
)和-1(1
),因为最重要(并且只有)位被视为符号位。
如果考虑两位值,您可以更清楚地看到它:0(00
),1(01
), - 1(11
), - 2({{ 1}})。
如果您更改为10
,您将满足您的期望。