口试宝典——强制类型转换之面试例题2
面试宝典——强制类型转换之面试例题2
题目:
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.****.net/zhanghenglei/article/details/7330365
http://www.cppblog.com/aaxron/archive/2011/02/28/140786.aspx