c - C 中的位域

标签 c int hex bit-fields negative-number

我有以下代码:

#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/

相关文章:

c - 有人知道BCD Utility头文件转换公式的好书或网站吗?

c++ - C/C++ : Conversion of char[] to int fails, unsigned char[] to int 有效,为什么?

python - 在包含数字和字符串的列表上使用 max()

python - 在将这个元组转换为 int 之前,我是否必须将其转换为列表?

c++ - 允许选择 int 宽度的 C/C++ 编译器

c - 为什么结构的大小应反射(reflect)其对齐方式?

c# - 如何将十六进制颜色值转换为其人类可读的字符串表示形式?

windows - Windows 崩溃对话框中十六进制数字的含义

c++ - 为什么在使用自定义 QFlags 实现时会出现这种按位操作错误?

c - 不使用索引的指针和数组