为什么为这段代码打印-1,我认为当bit-field设置为1时它是1?

Ram*_*rma 2 c bit-fields

#include<stdio.h>  
int main()  
{  
    struct byte  
    {  
        int one:1;  
    };

    struct byte var = {1};  // statement A
    printf("%d", var.one);  
    return 0;  
}  
Run Code Online (Sandbox Code Playgroud)

在这里,我想我们已经将整数变量'one'的位存储器限制为1,即; 它只能存储0和1而在'语句A'我们用'1'初始化了这个变量,这应该没问题,因为'one'仍然可以在其内存中保留一点但是它在控制台上打印-1!有帮助吗?

Kei*_*son 7

它是实现定义与类型定义的比特字段是否int等于signed intunsigned int.(这仅适用于位字段;否则intsigned int.字段完全相同.)

如果int one:1;已签名(因为它似乎在您的实现中),那么该单个位是符号位,唯一可能的值是0-1.值1,你已经用于初始化它,因为它是超出范围,被隐式转换-1.(实际上,转换的结果是实现定义的.)

将声明更改为:

unsigned int one:1;
Run Code Online (Sandbox Code Playgroud)

它可以有价值01.比特字段通常应该是显式无符号的,除非你真的需要它们进行签名 - 在这种情况下你应该使用signed int而不是int.