免费注册 查看新帖 |

Chinaunix

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

[C] 关于联合体,这个怎么考虑 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-10-20 09:08 |只看该作者 |倒序浏览
  1. void main()
  2. {
  3.         typedef union test
  4.         {
  5.                 char a[4];
  6.                 int b;
  7.                 short c;
  8.                 char d;
  9.         }test_t;
  10.         test_t m;
  11.         m.b=99;
  12.         m.c=123;
  13.         m.a[2]=20;
  14.         printf("%d\n",m.d);
  15. }
复制代码
这道题怎么算呢,

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2015-10-20 09:15 |只看该作者
short类型的m.c=123;
要么第一个字节值是0,第二个字节值是123
要么第一个字节值是123,第二个字节值是0
所以你要么输出123,要么输出0,取决于little-endian还是big-endian

论坛徽章:
7
2015年亚洲杯之约旦
日期:2015-03-05 17:03:522015亚冠之山东鲁能
日期:2015-09-29 13:01:2115-16赛季CBA联赛之四川
日期:2016-01-18 15:47:0215-16赛季CBA联赛之广夏
日期:2016-02-24 11:47:1515-16赛季CBA联赛之辽宁
日期:2016-11-01 09:45:4115-16赛季CBA联赛之青岛
日期:2017-02-15 10:02:182016科比退役纪念章
日期:2017-02-16 17:25:35
3 [报告]
发表于 2015-10-20 11:05 |只看该作者
对头,应该看大端小端,验证大端小端就是用 共用体来验证吧。

论坛徽章:
5
金牛座
日期:2015-07-03 13:32:00卯兔
日期:2015-07-03 13:32:17程序设计版块每日发帖之星
日期:2015-11-29 06:20:0015-16赛季CBA联赛之同曦
日期:2015-12-15 09:36:06CU十四周年纪念徽章
日期:2016-07-06 17:18:48
4 [报告]
发表于 2015-10-20 11:29 |只看该作者
我的主机是小端模式
m.b=99--->执行后union 数据二进制 01100011  00000000 00000000 00000000
m.c=123-->执行后union 数据二进制 01111011  00000000 00000000 00000000
m.a[2]=20->执行后union 数据二进制 01111011  00000000 00010100 00000000
打印m.d-->即最前面8位,011111011=123
这时候b为值1310843
  1. 13              m.b=99;
  2. (gdb) n
  3. 14              m.c=123;
  4. (gdb) p m
  5. $1 = {a = "c\000\000", b = 99, c = 99, d = 99 'c'}
  6. (gdb) n
  7. 15              m.a[2]=20;
  8. (gdb) p m
  9. $2 = {a = "{\000\000", b = 123, c = 123, d = 123 '{'}
  10. (gdb) n
  11. 16              printf("%d\n",m.d);
  12. (gdb) p m
  13. $3 = {a = "{\000\024", b = 1310843, c = 123, d = 123 '{'}
  14. (gdb) n
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP