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

时间:2015-01-18 18:47:05

标签: c unions

我在某个地方看到了这个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 个答案:

答案 0 :(得分:4)

  1. 联盟的所有成员占用内存中的相同位置。 u.cu.s具有相同的地址,因此更改u.c也会更改u.s。通常,您希望在以下情况下使用联合:

    • 具有一种类型或另一种类型的值,但要么在运行时之前不知道哪种类型,要么在运行时更改类型,
    • 将值写入A类型的变量,但从不同的类型读取相同的值
    • 在类型之间进行转换。
  2. 1000%256 = 232. 1000不适合unsigned char,因为unsigned char只有8位而1000是10位数。只有底部8位(它们本身代表数字232)才能存活。

相关问题