Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229080
  • 博文数量: 35
  • 博客积分: 659
  • 博客等级: 上士
  • 技术积分: 357
  • 用 户 组: 普通用户
  • 注册时间: 2011-08-01 21:16
文章分类
文章存档

2012年(12)

2011年(23)

分类: C/C++

2011-08-28 16:54:50

在百度直到上看到一道关于共用体的一道题,自己一开始不会,查了下书然后搞懂了,分享如下。

  1.   1 /*
  2.   2 已知字符0的ASCII码为十六进制的30,下面程序的输出是 A) 6 B) 9 C) 0 D) 3
  3.   3 */
  4.   4
  5.   5 #include <stdio.h>
  6.   6
  7.   7 int main(void)
  8.   8 {
  9.   9 union
  10.  10 {
  11.  11 unsigned char c;
  12.  12 unsigned int i[4];
  13.  13 }z;
  14.  14
  15.  15 z.i[0] = 0x36;
  16.  16 z.i[1] = 0x39;
  17.  17 printf("%c\n", z.c);
  18.  18 return 0;
  19. 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)模式存储读取数据,所以笔者在此处有疑问:在此处是从高字节位开始存储的吗?

阅读(1567) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~