位域:了解以下程序的工作原理
Bit-field: Understanding how the following program works
能否请你解释一下这个案例:
struct REGISTRU
{
int bit3:4;
};
struct REGISTRU bit={13};
printf("\n%d", bit.bit3);
为什么结果是-3?
我创建了一个结构,其中包含一个名为 bit3 的字段,类型为 4 位长度的整数(您可以存储 0 到 15 之间的值)。
struct REGISTRU
{
int bit3:4;
};
然后创建一个名为 bit 的 REGISTRU 类型的变量并将值初始化为 13。
struct REGISTRU bit={13};
最后打印出值
printf("\n%d", bit.bit3);
我们在使用位域时需要非常小心。
当您将变量声明为仅 int 时,在 C 中它是默认的 signed int.
如果您看到二进制值为 13,则为 1101。因此 MSB
被用作符号值,因此您得到 -3。如果你想让它取值 13 使用下面的代码:
struct REGISTRU
{
unsigned int bit3:4;
};
void main()
{
struct REGISTRU bit={13};
printf("\n%d", bit.bit3);
}
能否请你解释一下这个案例:
struct REGISTRU
{
int bit3:4;
};
struct REGISTRU bit={13};
printf("\n%d", bit.bit3);
为什么结果是-3?
我创建了一个结构,其中包含一个名为 bit3 的字段,类型为 4 位长度的整数(您可以存储 0 到 15 之间的值)。
struct REGISTRU
{
int bit3:4;
};
然后创建一个名为 bit 的 REGISTRU 类型的变量并将值初始化为 13。
struct REGISTRU bit={13};
最后打印出值
printf("\n%d", bit.bit3);
我们在使用位域时需要非常小心。 当您将变量声明为仅 int 时,在 C 中它是默认的 signed int.
如果您看到二进制值为 13,则为 1101。因此 MSB
被用作符号值,因此您得到 -3。如果你想让它取值 13 使用下面的代码:
struct REGISTRU
{
unsigned int bit3:4;
};
void main()
{
struct REGISTRU bit={13};
printf("\n%d", bit.bit3);
}