关于 C 中 union 的代码片段问题

Code snippet issue about union in C

我在某处看到了这个 C 代码片段:

#include <stdio.h>

union {
    struct {
        unsigned char c1:3;
        unsigned char c2:3;
        unsigned char c3:2;
    } s;
    unsigned char c;
} u;

int main()
{
    u.c = 100;
    printf("%d %d %d\n", u.s.c1, u.s.c2, u.s.c3);

    return 0;
}
  1. 如果改变u.c = 100行的值,输出会不一样,这是怎么回事?

  2. 如果我给它分配一个大整数,比如1000,会有警告信息(我在Emacs中使用flycheck):

    implicit conversion from `int' to `unsigned char' changes value from 1000 to 232, 
    

    什么是 232?

  1. 联合的所有成员在内存中占据相同的位置。 u.cu.s 具有相同的地址,因此更改 u.c 也会更改 u.s。通常,您在需要时使用联合:

    • 具有一种类型或另一种类型的值,但直到运行时才知道是哪种类型,或者类型在运行时发生变化,
    • 将值写入类型 A 的变量,但从不同的类型读取相同的值,
    • 在类型之间进行转换。
  2. 1000 % 256 = 232。1000 不适合 unsigned char,因为 unsigned char 只有 8 位,而 1000 是 10 位数字。只有低 8 位,它们本身代表数字 232,幸存下来。