在百度直到上看到一道关于共用体的一道题,自己一开始不会,查了下书然后搞懂了,分享如下。
- 1 /*
-
2 已知字符0的ASCII码为十六进制的30,下面程序的输出是 A) 6 B) 9 C) 0 D) 3
-
3 */
-
4
-
5 #include <stdio.h>
-
6
-
7 int main(void)
-
8 {
-
9 union
-
10 {
-
11 unsigned char c;
-
12 unsigned int i[4];
-
13 }z;
-
14
-
15 z.i[0] = 0x36;
-
16 z.i[1] = 0x39;
-
17 printf("%c\n", z.c);
-
18 return 0;
-
19 }
输出的结果是 9。
共用体是多成员的覆盖存储,几个不同类型的成员变量存储在同一起始地址的内存中,任意时刻只存储一种数据。因此分配给共用体变量的存储区,等于占内存最大的成员所需的存储区。
z.c / z.i[0] z.i[1] z.i[2] z.i[3]
z.c与z.i[0]共享内存地址。
z.c占一个字节8位,但是z.i[0]占四个字节32位(编译环境不同会有所不同)。
存储时转换成二进制码在内存中存储。
有网友说是从高字节位开始存储,00110110 00000000 00000000 00000000 c占一个字节,从高字节位读取所以结果是00110110 转换成ASCII码就是54,对应的字符是数字6。
但是x86是小端(little-endian)模式存储读取数据,所以笔者在此处有疑问:在此处是从高字节位开始存储的吗?
阅读(1608) | 评论(0) | 转发(1) |