- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我对 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 位,因此最后一位将是 10
或 2
的答案,因为它实际上是一个负数,因此输出将为 -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/
我是一名优秀的程序员,十分优秀!