【程序员面试宝典】强制类型转换之面试例题2

来源:互联网 发布:java完全自学txt下载 编辑:程序博客网 时间:2024/06/06 02:02

题目:

void main()  {       unsigned int a = 0xFFFFFFF7;       unsigned char i = (unsigned char)a;       char* b = (char*)&a;          printf("%08x, %08x\n", i, *b);  }  

 

输出:

000000f7, fffffff7

(1)i的输出的解释:

unsigned char仅占一个字节,对int型的a进行截断。

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。

小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;

大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。

基于X86平台的PC机是小端字节序的

基于以上理论可知,截断时,i会获得低字节数据F7。由于是无符号的,要求输出8位,则填充为000000F7才输出。

(2)*b的解释:

指针类型的转换,而非char类型的转换。

先看下面一个例子:

unsigned int a = 0XAAAAAAA7;unsigned char i = (unsigned char)a;char * b = (char*)&a;unsigned char* c = (unsigned char*)&a;printf("%08x, %08x, %08x, %08x\n", a, i, *b, *c);printf("%x, %x, %x, %x\n", a, i, *b, *c);


输出:

可见,输出与前六位无关,说明发生了截断。

具体解释如下:

(char*)&a 将a的地址转换成一个char型指针,和(int*)&a 转换成一个int是不同的,它只会指向&a的低8位内存,其余的发生了截断。

所以 现在b指向的是0xf7, 这是一个负数,使用%08x 输出 就是ffffffff7.

 

参考:

http://blog.csdn.net/zhanghenglei/article/details/7330365

http://www.cppblog.com/aaxron/archive/2011/02/28/140786.aspx