int main ()
{
struct bit{
char f1:1;
char f2:1;
};
struct bit b;
b.f1= 0x1;
b.f2 = 0x1;
printf("%d\n",b.f1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
使用gcc编译代码输出-1.它应该不是1吗?是因为我正在编译一个小端机器吗?
补充:使用GDB进行调试时,我看到初始化struct成员后的值为-1.即打印前它是-1.以下是GDB的打印输出:
(gdb)pb
$ 7 = {f1 = -1'',f2 = -1''}
如果您需要更多调试命令,请告诉我.请提供执行此操作的命令.
char可以是一个unsigned或可以是一个signed类型,由编译器来决定.在你的情况下,signed当你打印你的位字段时,编译器会将符号int扩展到你的位扩展的大小.在2补码表示中,不应忘记-1表示为每个位集11111111 11111111 11111111 11111111在32位int上为-1.如果只有1位,则只能表示2个补码中的2个值:0和1,它是0和-1的二进制表示.
编辑:这里是C标准第6.2.5节第15节的实际部分:char,signed char和unsigned char这三种类型统称为字符类型.实现应将char定义为具有与signed char或unsigned char.35相同的范围,表示和行为
35)在limits.h中定义的CHAR_MIN 将具有值0或SCHAR_MIN之一,这可用于区分这两个选项.无论做出何种选择,char都是与其他两种类型不同的类型,并且与两者都不兼容.