int main ()
{
struct bit{
char f1:1;
char f2:1;
};
struct bit b;
b.f1= 0x1;
b.f2 = 0x1;
printf("%d\n",b.f1);
return 0;
}
使用 gcc 编译代码输出 -1。不应该是1吗?是因为我在小端机器上编译吗?
添加:在使用 GDB 调试时,我看到初始化结构成员后的值为 -1。即打印前为 -1。以下是 GDB 的打印输出:
(gdb) p b
$7 = {f1 = -1 '', f2 = -1 ''}
如果您需要更多调试命令,请告诉我。请提供执行此操作的命令。
最佳答案
char
可以是 unsigned
也可以是 signed
类型,由编译器决定。在你的情况下,它显然是 signed
所以当你打印你的位域时,编译器将符号扩展到 int
你的位扩展到的大小。在 2 补码表示中,不应忘记 -1 表示为 32 位 int 上的每一位集 11111111 11111111 11111111 11111111 是 -1。当你只有 1 位时,你只能用 2 个补码表示 2 个值:0 和 1,这是 0 和 -1 的二进制表示。
编辑: 这里是 C 标准的实际部分 Chapter 6.2.5 section 15 : char, signed char, unsigned char 三种类型统称为字符类型。实现应将 char 定义为具有与 signed char 或 unsigned char 相同的范围、表示和行为。35
35) limits.h 中定义的 CHAR_MIN 将具有值 0 或 SCHAR_MIN 之一,这可用于区分这两个选项。无论做出何种选择,char 都是与其他两种类型不同的类型,并且与任何一种都不兼容。
关于c - 为什么代码输出 -1 而不是 1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4034534/