c - C 中用于有符号整数结构 num { int a :3; int b:2; int c:1; } 的位字段

标签 c struct bit-fields

我对 C 中的位域感到困惑。任何人都可以向我解释位域的概念,或者任何人都可以建议我一些好的资源来理解结构中位域的基本概念吗?

我试过这个程序,但我无法理解输出结果。

在 gcc 32 位编译器中

struct num
{
    int a:3;
    int b:2;
    int c:1;
};
void main()
{
    struct num n={8,-6,5};
    printf("%d\n%d\n%d",n.a,n.b,n.c);
}

输出:0,-2,-1

最佳答案

好吧,因为你是初学者,让我们试着解释一下..

第一个是 int a : 3 这意味着您有兴趣存储 3 位,但主要是您分配的值为 8.. 现在 8 的二进制值为 1000,但由于您只考虑 3 位,因此采用最后 3 个零 (0),输出为 0

现在第二个是 int b : 2 这意味着您要存储 2 位。现在从主要你写-6。现在,每当任何负数存储在内存中时,它都存储为 2 的补码。因此 6 的二进制值为 00000000 00000000 00000000 00000110 并且因为它是负数,因此 1 的补码11111111 11111111 11111111 11111001 并且如果您将 1 添加到 2 的补码 中,它将是 11111111 11111111 11111111 11111010..现在因为您在结构中只占用了 2 位,因此最后一位将是 102 的答案,因为它实际上是一个负数,因此输出将为 -2

现在内存的第 31 位已经设置好,因此无论你给出什么新数字,它都会被视为负数..现在 c 是 1 位,主要是你给出 5,这基本上是 0101 & 因此它将是最后一位 & 因此答案将是 -1...

因此您的编译器运行正常..

关于c - C 中用于有符号整数结构 num { int a :3; int b:2; int c:1; } 的位字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31189735/

相关文章:

java - 在现代 Java 8 API 中使用位域而不是 EnumSet 的理由

c - C/C++ 的简写和快捷方式

c - 如何测量C中循环中几个函数的执行时间

java - 删除最低位

c - 使用函数初始化结构

python pack 4 byte integer with bytearray struct.pack中的字节

c++ - 在位域中使用显式类型枚举类时的编译错误 (gcc C++0x/C++11)

c - 将位域结构映射到 volatile 寄存器

Posix 正则表达式搜索中的捕获组不正确

c - 访问非空结构成员时出现段错误-