关于 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;
}
如果改变u.c = 100
行的值,输出会不一样,这是怎么回事?
如果我给它分配一个大整数,比如1000,会有警告信息(我在Emacs中使用flycheck):
implicit conversion from `int' to `unsigned char' changes value from 1000 to 232,
什么是 232?
联合的所有成员在内存中占据相同的位置。 u.c
和 u.s
具有相同的地址,因此更改 u.c
也会更改 u.s
。通常,您在需要时使用联合:
- 具有一种类型或另一种类型的值,但直到运行时才知道是哪种类型,或者类型在运行时发生变化,
- 将值写入类型 A 的变量,但从不同的类型读取相同的值,
- 在类型之间进行转换。
1000 % 256 = 232。1000 不适合 unsigned char,因为 unsigned char 只有 8 位,而 1000 是 10 位数字。只有低 8 位,它们本身代表数字 232,幸存下来。
我在某处看到了这个 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?
联合的所有成员在内存中占据相同的位置。
u.c
和u.s
具有相同的地址,因此更改u.c
也会更改u.s
。通常,您在需要时使用联合:- 具有一种类型或另一种类型的值,但直到运行时才知道是哪种类型,或者类型在运行时发生变化,
- 将值写入类型 A 的变量,但从不同的类型读取相同的值,
- 在类型之间进行转换。
1000 % 256 = 232。1000 不适合 unsigned char,因为 unsigned char 只有 8 位,而 1000 是 10 位数字。只有低 8 位,它们本身代表数字 232,幸存下来。