免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 2715 | 回复: 20
打印 上一主题 下一主题

菜鸟关于union类型的疑惑,请高手指点 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-01-05 16:33 |只看该作者 |倒序浏览
如下程序:
main()
     {
          union{                   /*定义一个联合*/
               int i;
               struct{             /*在联合中定义一个结构*/
                    char first;
                    char second;
               }half;
          }number;
          number.i=0x4241;         /*联合成员赋值*/
          printf("%c%c\n", number.half.first, mumber.half.second);
          number.half.first='a';   /*联合中结构成员赋值*/
          number.half.second='b';
          printf("%x\n", number.i);
          getch();
     }
    输出结果为:
     AB
     6261


疑问:这样的运行结果在高端字节序和低端字节序的机器上都是一样的吗?请大虾们指点

论坛徽章:
0
2 [报告]
发表于 2004-01-05 16:48 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

不一样。

论坛徽章:
0
3 [报告]
发表于 2004-01-05 16:52 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

可以举个例子吗?谢谢

论坛徽章:
0
4 [报告]
发表于 2004-01-05 17:06 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

眼下没有这种机器啊,反正就是字节顺序会颠倒过来,你可以问一些有 SUN,SGI, PPC 机器的大虾,让他们帮你试一试。

论坛徽章:
0
5 [报告]
发表于 2004-01-05 17:11 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

收到!谢谢win_hate

麻烦看这个帖子又有不同字节序机器的或者已经知道结果可以更加详细的解释的大虾告知结果。不胜感激ing

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
6 [报告]
发表于 2004-01-05 17:24 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

我机器上的运算结果,aix5l,gcc:

61624241

第一个printf什么也没输出。
zhonggp 该用户已被删除
7 [报告]
发表于 2004-01-05 17:46 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
8 [报告]
发表于 2004-01-05 18:17 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

sco openserver 5
使用cc编译
结果
AB
6261

论坛徽章:
1
荣誉版主
日期:2011-11-23 16:44:17
9 [报告]
发表于 2004-01-05 18:31 |只看该作者

菜鸟关于union类型的疑惑,请高手指点


  1. #include         <stdio.h>;
  2. int main()
  3. {
  4.         char *p;
  5.         union{ /*定义一个联合*/
  6.                 int i;
  7.                 struct{ /*在联合中定义一个结构*/
  8.                         char first;
  9.                         char second;
  10.                 }half;
  11.         }number;
  12.         number.i=0x4241; /*联合成员赋值*/
  13.                        
  14.         p = (char *)&number.i;
  15.         printf("add0 = %p value = %x\n", p, *p++);
  16.         printf("add1 = %p value = %x\n", p, *p++);
  17.         printf("add2 = %p value = %x\n", p, *p++);
  18.         printf("add3 = %p value = %x\n\n", p, *p++);
  19.        
  20.         printf("add(first) = %p value = %x\n", &number.half.first, number.half.first);
  21.         printf("add(second) = %p value = %x\n\n", &number.half.second, number.half.second);
  22.         printf("%d%d\n\n", number.half.first, number.half.second);
  23.          
  24.         number.half.first='a'; /*联合中结构成员赋值*/
  25.         number.half.second='b';
  26.          
  27.         p = (char *)&number.i;
  28.         printf("add0 = %p value = %x\n", p, *p++);
  29.         printf("add1 = %p value = %x\n", p, *p++);
  30.         printf("add2 = %p value = %x\n", p, *p++);
  31.         printf("add3 = %p value = %x\n\n", p, *p++);
  32.        
  33.         printf("add(first) = %p value = %x\n", &number.half.first, number.half.first);
  34.         printf("add(second) = %p value = %x\n\n", &number.half.second, number.half.second);
  35.        
  36.         p = (char *)&number.i;
  37.         printf("add0 = %p value = %x\n", p, *p++);
  38.         printf("add1 = %p value = %x\n", p, *p++);
  39.         printf("add2 = %p value = %x\n", p, *p++);
  40.         printf("add3 = %p value = %x\n\n", p, *p++);
  41.        
  42.         printf("%x\n", number.i);
  43.         //getchar();
  44.         return 0;
  45. }
复制代码

我的编译环境为aix 5L,gcc 3.3,结果如下:

  1. add0 = 2ff2296d value = 0
  2. add1 = 2ff2296e value = 0
  3. add2 = 2ff2296f value = 42
  4. add3 = 2ff22970 value = 41

  5. add(first) = 2ff2296c value = 0
  6. add(second) = 2ff2296d value = 0

  7. 00

  8. add0 = 2ff2296d value = 61
  9. add1 = 2ff2296e value = 62
  10. add2 = 2ff2296f value = 42
  11. add3 = 2ff22970 value = 41

  12. add(first) = 2ff2296c value = 61
  13. add(second) = 2ff2296d value = 62

  14. add0 = 2ff2296d value = 61
  15. add1 = 2ff2296e value = 62
  16. add2 = 2ff2296f value = 42
  17. add3 = 2ff22970 value = 41

  18. 61624241
复制代码

特别是地址为2ff2296d的,大家注意它的值。
我也弄不清楚了,大家分析分析吧。

论坛徽章:
0
10 [报告]
发表于 2004-01-05 19:10 |只看该作者

菜鸟关于union类型的疑惑,请高手指点

系统redhat 9.0

add0 = 0xbffff351 value = 41
add1 = 0xbffff352 value = 42
add2 = 0xbffff353 value = 0
add3 = 0xbffff354 value = 0

add(first) = 0xbffff350 value = 41
add(second) = 0xbffff351 value = 42

6566

add0 = 0xbffff351 value = 61
add1 = 0xbffff352 value = 62
add2 = 0xbffff353 value = 0
add3 = 0xbffff354 value = 0

add(first) = 0xbffff350 value = 61
add(second) = 0xbffff351 value = 62

add0 = 0xbffff351 value = 61
add1 = 0xbffff352 value = 62
add2 = 0xbffff353 value = 0
add3 = 0xbffff354 value = 0

6261
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP