为什么以下代码的输出是-1和-2?

时间:2017-05-10 10:27:53

标签: c struct bit-fields

为什么下面代码的输出是-1和-2,它应该是1和2,对吗?

同样在64位服务器上,以下结构的大小是4字节,它应该是8字节吗?

#include<stdio.h>
struct st
{
        int a:1;
        int b:2;
};
main()
{
        struct st obj={1,2};
        printf("a = %d\nb = %d\n",obj.a,obj.b);
        printf("Size of struct = %d\n",sizeof(obj));
}

1 个答案:

答案 0 :(得分:3)

编译所有启用的警告,并阅读编译器所说的内容:

Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
main.c:7:1: warning: type specifier missing, defaults to 'int' [-Wimplicit-int]
main()
^
main.c:9:26: warning: implicit truncation from 'int' to bitfield changes value
      from 2 to -2 [-Wbitfield-constant-conversion]
        struct st obj={1,2};
                         ^
main.c:11:40: warning: format specifies type 'int' but the argument has type
      'unsigned long' [-Wformat]
        printf("Size of struct = %d\n",sizeof(obj));
                                 ~~    ^~~~~~~~~~~
                                 %lu
3 warnings generated.

回想一下,

  

带符号的1位变量只能包含两个值,-1和0

正如您在此answer中看到的那样。

所以如果你改用这个结构:

struct st
{
        int a:2;
        int b:3;
};

您将获得所需的输出。

answer也提供了一个很好的解释。