我在某个地方看到了这个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;
}
如果更改u.c = 100
行中的值,输出会有所不同,这是怎么回事?
如果我将它分配给一个像1000这样的大整数,会有警告信息(我在Emacs中使用flycheck):
implicit conversion from `int' to `unsigned char' changes value from 1000 to 232,
什么是232?
答案 0 :(得分:4)
联盟的所有成员占用内存中的相同位置。 u.c
和u.s
具有相同的地址,因此更改u.c
也会更改u.s
。通常,您希望在以下情况下使用联合:
1000%256 = 232. 1000不适合unsigned char,因为unsigned char只有8位而1000是10位数。只有底部8位(它们本身代表数字232)才能存活。