c - 具有带符号整数位字段的结构产生负输出

标签 c struct bit-fields

这是带有结构体的 C 代码。

#include <stdio.h>
#include <stdlib.h>

int main()
{
    struct{
        int a : 4;
        unsigned int b : 3;
        int c : 3;
    } x;

    x.a = 7;
    x.b = 7;
    x.c = 7;

    printf("%d\n",x.a);
    printf("%d\n",x.b);
    printf("%d\n",x.c);
    return 0;
}

在上面的 C 程序中,x.c 从内存中分配了 3 位,但输出结果为 -1。这是什么原因?

最佳答案

数据成员 c 被定义为 int 类型(对于您的编译器来说是 signed int),并且只有 3 位来表示有符号值。因此最高有效位被视为符号位,二进制表示法中的 7 为

111

根据定义,最左边的位被用作符号位

int c : 3;

所以这个位组合意味着该数字是负数并且等于-1。 该位域可存储的最大正值等于3

011

最小负值等于-4

100

请考虑,定义为 int 类型的位字段是否会被解释为 unsigned int 还是 实现定义>有符号整数。您的编译器将 int 类型的位字段视为具有 signed int 类型 因此,最好为位字段显​​式指定 signed intunsigned int

来自 C 标准

...except that for bitfields, it is implementation-defined whether the specifier int designates the same type as signed int or the same type as unsigned int.

关于c - 具有带符号整数位字段的结构产生负输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24974459/

相关文章:

json - 在 Swift 中解码 Codable

c - 为 AVR 端口使用位字段

c - C 中位域和 union 的大小

类中的c++动态结构

c - Fortran/C 互操作性将结构从 Fortran 传递到带有可分配项的 C

c - 跳过c中的scanf循环

python - 无法安装 Kivy : Cython/GCC error

c - 这是未定义的行为(字符串修改)

c - 用 C 实现列表时,我试图删除第一个元素并保留列表的其余部分