免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: warmofice
打印 上一主题 下一主题

苦思冥想,关于【指针类型强制转换】的问题,求解! [复制链接]

论坛徽章:
0
131 [报告]
发表于 2012-06-18 15:23 |只看该作者
回复 128# 塑料袋



之前没见过您嘛,怎么舍得出来卖弄你那傻逼的定论?

把我和瓦砾摆一起到是不错,他是我同学。瓦砾在的时候好像您屁都不敢放,可有此事?别忘了,瓦砾说了,只要cu给他尊严和自由,立马就地满血复活。   

论坛徽章:
0
132 [报告]
发表于 2012-06-19 17:40 |只看该作者
-------------------------------------------------------------------------------------------------------------
上文我能理解,知道指针类型决定了  *(指针)的值得取值范围。但是下文,我就不理解了。
                   unsigned int a = 0xfffffff7;
        
                   printf("%x\n", *((int   *)&a));
                   printf("%x\n", *((char *)&a));
          运行结果:
                    0xfffffff7
                    0xfffffff7
--------------------------------------------------------------------------------------------------------------
你取的数太特殊了,printf("%x\n", *((char *)&a)); 将会打出一个8bit的数即f7, 但是要求要是%x形式输出,所以高位将会补1,输出结果依旧是0xfffffff7

这样定义一下试试 unsigned int a = 0x1111fff7; 去验证一下你的想法
输出应该是 0x1111fff7 和0xfffffff7

指针本身就是一个地址(一个32bit的数),加上类型限制后,这个地址块中将存放该类型的数据。

论坛徽章:
0
133 [报告]
发表于 2012-09-08 17:17 |只看该作者
回复 9# folklore


嗯。正解。谢谢了。我也学到了东西了, 我在linux下反复测试了一下,你说的很有道理,就像以下:
char c = 0xf2;
printf("0x%x\n", *((char *)&c));   // output: 0xfffffff2  32位机
char c1 = 0x72;
printf("0x%x\n", *((char *)&c));  // output: 0x72
c和c1的区别在于二进制最高位一个为1一个为0,因此在编译器中char 默认为带符号数。
至于输出c输出0xfffffff2 按照机器整形的宽度(4B)来实现。
但是,c在输出时,高位为什么都填充了1,c1则全部填充了0 , 是不是编译器会自动填充符号位啊 ?   
嗯。感谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP