位字段是否对应于累加器中的寄存器?
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;
}
我理解的东西:
- :是位域运算符。
int one :1;
表示创建变量one
,内存为1位。
-struct byte var = {1};
尝试将 1 放入变量一中。
没看懂的地方
为什么我输入struct byte var = {even_number};
时输出为零
为什么输入struct byte var = {odd_number};
时输出为-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
位有符号整数的值属于区间-2
n-1
.. 2
n-1
-1
.
在您的示例中,n
为 1
,值的区间为 -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;
}
#include<stdio.h>
int main()
{
struct byte
{
int one:1;
};
struct byte var = {1};
printf("%d\n", var.one);
return 0;
}
我理解的东西:
- :是位域运算符。
int one :1;
表示创建变量one
,内存为1位。
-struct byte var = {1};
尝试将 1 放入变量一中。
没看懂的地方
为什么我输入
struct byte var = {even_number};
时输出为零
为什么输入
struct byte var = {odd_number};
时输出为-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
位有符号整数的值属于区间-2
n-1
.. 2
n-1
-1
.
在您的示例中,n
为 1
,值的区间为 -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;
}