打印位类型为整数?如何转换?

Fei*_*Xue 7 c bit

该计划是:

typedef struct xp {
        int a:2;
        int b:2;
        int c:1;
} xp;

int main(void)
{
        xp x;
        memset(&x, 0, sizeof(xp));

        x.a = 1;
        x.b = 3;
        x.c = 1;

        printf("%d\n",x.a);
        printf("%d\n",x.b);
        printf("%d\n",x.c);

        return 0;
}
Run Code Online (Sandbox Code Playgroud)

我得到1 -1 -1,为什么?a,b和c如何存储在x中?printf("%d \n",xa)时发生了什么; 执行?

Car*_*rum 5

您正在为您的位域使用带符号的类型,这意味着您已经创建了两个两位有符号整数和一个一位有符号整数.

两位有符号整数(二进制补码)的可能值为:-2,-1,0和1:

一位有符号整数(二进制补码)的可能值为-1和0.

通过存储"不适合"的值,就像您在这些行中所做的那样:

x.b = 3;
x.c = 1;
Run Code Online (Sandbox Code Playgroud)

您将获得奇怪的行为,因为您存储的位模式在读取时会有不同的解释.通过以下操作可以获得类似的体验:

char x = 58147;
Run Code Online (Sandbox Code Playgroud)

在具有8位char类型的计算机上,该值将不适合,因此您在访问时将阅读不同的内容x.