位字段是否对应于累加器中的寄存器?

Does the bit field correspond to registers in the accumulator?

#include<stdio.h>
int main()
{
 struct byte
 {
 int one:1;
 };
 struct byte var = {1};
 printf("%d\n", var.one);
 return 0;
}

我理解的东西:

-struct byte var = {1}; 尝试将 1 放入变量一中。

没看懂的地方

我的类比是负标志(第 7 个标志)以某种方式变成 high/1 并给出 -1。但我没有 proof.I 认为一定有其他逻辑。但是,位域是否对应累加器中的寄存器?

signed 类型的一位长存储仅足以容纳两个值 (in 2's complement format),即 0-1

如果您想要 1 的值,您至少需要将位字段设置为 2。

否则,如果您不想处理 -ve 个值,(或者,通常)最好在使用位域时使用 unsigned 类型.

由于:1,类型struct byte的变量只存储一位信息(请注意误导性名称)。

struct byte 类型变量的字段 one 使用初始化值的最右边位进行初始化,即 0 表示偶数, 1 表示奇数数字。所有其他位都被忽略。

但是 one 属性 的类型是 int,(即有符号)。它可以存储成n位有符号整数的值属于区间-2n-1 .. 2n-1-1.

在您的示例中,n1,值的区间为 -1..0。最右边的位也是最左边的位,当以 2 补码形式存储时,1 是有符号整数 -1.

的位表示

发生这种情况是因为您将位字段声明为 int,它已签名。

假设2's complement表示负数,这意味着如果设置了最高位则数字为负数。由于该字段只有 1 位,因此设置该位会给您一个负数,即 -1.

如果要在该字段中存储 0 或 1,则需要将其声明为 unsigned int,然后使用 %u 格式说明符打印它。

#include<stdio.h>
int main()
{
   struct byte
   {
     unsigned int one:1;
   };
   struct byte var = {1};
   printf("%u\n", var.one);
   return 0;
}