3

我不明白Union是如何工作的。。

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

int main()
{
    union {
    int a:4;
    char b[4];
    }abc;
abc.a = 0xF;

    printf(" %d, %d, %d, %d, %d, %d\n", sizeof(abc), abc.a, abc.b[0], abc.b[1], abc.b[2], abc.b[3]);

    return 0;
}

在此处输入图像描述
在上述程序中。
我做了int a : 4;
所以,a 应该占用 4 位。
现在我正在存储,a = 0xF; //i.e a= 1111(Binary form)
所以当我访问b[0 0r 1 or 2 or 3] 为什么输出不来时1, 1, 1, 1

4

4 回答 4

3

您工会的总规模至少为4 * sizeof(char).

假设您使用的编译器将此作为定义的行为处理,请考虑以下事项:

  1. abc永远不会完全初始化,因此它包含随机的零和一。大问题。所以,首先这样做:
    memset(&abc, 0, sizeof(abc));
  2. 联合应该是其最大成员的大小,因此您现在应该有 4 个清零字节00000000 00000000 00000000 00000000
  3. 你只设置了 4高,所以你的联合将变成这样:
    00000000 00000000 00000000 00001111
    11110000 00000000 00000000 00000000.

    我不确定您的编译器如何处理这种类型的对齐,所以这是我能做的最好的。

您也可以考虑进行 char-to-bits 转换,以便您可以手动检查二进制格式中每个位的值:
Access individual bits in a char c++

祝你好运!

于 2012-05-30T13:38:45.490 回答
2

0xF如果看成4位有符号的话就是-1,所以输出是正常的。b 甚至没有完全赋值,所以它的值是未定义的。它是一个 4 字节实体,但您只分配一个 4 位实体。所以在我看来一切都很正常。

于 2012-05-30T13:32:56.207 回答
0

因为每个char(在大多数平台上)需要 1 个字节,即 8 位,所以所有 4 位都a属于b[].

除此之外,位字段的存储方式取决于编译器,因此它没有定义,b[]映射到哪个字节......

于 2012-05-30T13:30:37.220 回答
0

如果您将其定义为 4 位有符号数,则 0xF 为 -1。检查二补码二进制表示以了解原因。

而且您没有初始化b,因此它可能包含任何随机值。

于 2012-05-30T13:33:54.880 回答