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

来源:互联网 发布:淘宝密令符号 编辑:程序博客网 时间:2024/05/21 08:52

题目:

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