为什么下面代码的输出是-1和-2?
Why output of the below code is -1 and -2?
为什么下面代码输出的是-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));
}
在启用所有警告的情况下进行编译,并阅读您的编译器所说的内容:
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.
回想一下,
a signed 1 bit variable can hold only two values, -1 and 0
如您在此 answer 中所见。
因此,如果您改为使用此结构:
struct st
{
int a:2;
int b:3;
};
您将获得所需的输出。
这个answer也给出了很好的解释。
为什么下面代码输出的是-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));
}
在启用所有警告的情况下进行编译,并阅读您的编译器所说的内容:
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.
回想一下,
a signed 1 bit variable can hold only two values, -1 and 0
如您在此 answer 中所见。
因此,如果您改为使用此结构:
struct st
{
int a:2;
int b:3;
};
您将获得所需的输出。
这个answer也给出了很好的解释。