我有以下代码:
#include <stdio.h>
struct test
{
int x: 2;
int y: 2;
};
int main()
{
test t;
t.x = -1;
printf("%d", t.x);
return 0;
}
这段代码打印出我能理解的-1
,
如果相同的代码,%d
被替换为%x
格式说明符,如下所示:
#include <stdio.h>
struct test
{
int x: 2;
int y: 2;
};
int main()
{
test t;
t.x = -1;
printf("%x", t.x);
return 0;
}
输出变成ffffffff
。
请解释为什么会这样。
最佳答案
当您将您的位字段传递给 printf
时,这是一个参数数量可变的函数,该值会转换为 int
。尽管该值只有两位,但其二进制值 11
在二进制补码表示中表示 -1
,因此该值被符号扩展为整数 - 1
当它被发送到 printf
时。这是在 32 位系统上以十六进制表示的 0xffffffff
。
如果您只想看到两位以十六进制形式打印,请将您的位字段设置为无符号。这将确保在打印之前不会执行符号扩展:
#include <stdio.h>
struct test
{
unsigned int x: 2;
unsigned int y: 2;
};
int main()
{
struct test t;
t.x = -1;
printf("%x", t.x);
return 0;
}
这会打印 3 ( demo )。
关于c - C 中的位域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31026471/