【程序员面试宝典】强制类型转换之面试例题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.csdn.net/zhanghenglei/article/details/7330365
http://www.cppblog.com/aaxron/archive/2011/02/28/140786.aspx
版權聲明:本文為博主原創文章,未經博主允許不得轉載。
轉載于:https://www.cnblogs.com/wangicter/archive/2012/08/26/4767315.html
總結
以上是生活随笔為你收集整理的【程序员面试宝典】强制类型转换之面试例题2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分享转帖 -- 考勤的背后 (加注个人点
- 下一篇: WinForm开发中针对TreeView