细节问题系列之指针类型强制转换

4 篇文章 0 订阅

题目:

unsigned int nValue = 0x5D6C7B3E;
printf("%c", *((unsigned char *)(&nValue) + 2) + 2);

变形1:

unsigned int nValue = 0x5D6C7B3E;
printf("%X", *((unsigned char *)(&nValue) + 2) + 2);

变形2:

unsigned int nValue = 0x5D6C7B3E;
printf("%d", *((unsigned char *)(&nValue) + 2) + 2);

分析

  1. 咱们先看原题目,本题不考虑编译器位数的影响,一般32位编译器和64位编译器对于int的实现相同,长度均为4个字节,16位编译器不在考虑范围,另外本题目也不考虑字节序的影响,采用最通用的环境intel小端字节序,即高位存储在高地址,地位存储在低地址,说明了这些下面我们来分析题目本身的考点。

  2. 这道题目的关键在于指针类型的强制转换,我们来一步一步分析,(&nValue)是取无符号整形变量nValue的地址,其类型默认为(unsigned int *),但是前面有强制类型转换,(unsigned char *)表示将一个指针转换成无符号字符型的指针,由于指针的类型发生了变化,因此指针的++运算从原来每次地址+4变成了每次地址+1,那么((unsigned char *)(&nValue) + 2)就是表示从首地址向后加2个字节,假设unsigned char *ptr = (unsigned char *)(&nValue),则((unsigned char *)(&nValue) + 2)即为ptr+2,其中*ptr的内容为0x3E, *(ptr+2)的内容就为0x6C,也就是*((unsigned char *)(&nValue) + 2)的值为0x6C,最后还有+2,也就是最后表达式的值为0x6E。

  3. 本题目的另一个考点就是输出格式,原题目中%c是以字符输出,0x6E转换成10进制是110,ji字母n的ASCII码,变形1中%X是以16进制输出,其中的字母用大写表示,与之相对的是%x字母用小写表示,变形2中就是以整数输出,也就是110了

  4. 三道题的输出结果分别为n、6E、110

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AlbertS

常来“玩”啊~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值