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

时间:2015-03-20 04:17:52

标签: c structure bit-fields

我期待1作为输出..

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

3 个答案:

答案 0 :(得分:9)

通过执行int a:1,您将a设为1 bit signed int。它由1位表示,并假设您的实现中有两个补码表示,它的范围为{0,-1}。因此,将1设置为a将代表值-1

<强>附录

请注意,按C90标准,普通intsigned 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,您将满足您的期望。