c - 为什么代码输出 -1 而不是 1

标签 c

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/

相关文章:

c++ - 如何在执行 LoadLibrary ("*.exe"时初始化 CRT)

c - 为什么返回指向局部变量或参数的指针是不好的做法?

c - STM32F405 bxCan 不离开初始化模式

c - 提前退出递归函数时返回什么?

c++ - gcc/clang 是否有可能在剥离所有调试信息的同时链接到可执行文件?

c - scanf() 尝试输入带或不带空格的字符串时会关闭程序

c++ - 如何清除arduino输出串口窗口中的垃圾字符?我需要使用软件串行发送和接收字符

Char 在 C 中的多维数组中不起作用。需要澄清

c - strcpy 将一个项目从 dirent 转换为 char[]

c - 如何将可变大小数组从 Windows 内核驱动程序传递到用户模式进程?