关闭

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

标签: 指针class强制转换输出格式位移
501人阅读 评论(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
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:62179次
    • 积分:1345
    • 等级:
    • 排名:千里之外
    • 原创:74篇
    • 转载:7篇
    • 译文:1篇
    • 评论:15条
    文章分类
    最新评论
    博客记录
    刚刚起步
    2013-10-05 08:39 写了第一篇转载博文
    2015-11-19 11:20 收到第一条博客评论
    2016-12-27 20:18 翻译第一篇英文资料
    2017-03-27 09:55 访问第一次突破三万
    2017-05-21 09:25 积分第一回到达一仟
    2017-05-21 09:25 等级第一次满足四级