2013-08-18 68 views
2

代碼:如何解釋一個C程序的這個輸出

int main() 
{ 
    unsigned int a = 0xfffffff7; 
    char *b = (char *)&a; 
    printf("%08x",*b); 
} 

輸出爲:fffffff7。 我的機器是little-endian。當然我知道*b等於0xf7,但我不知道爲什麼printf()的輸出是這樣的。

+6

你在期待什麼? – TGO

+1

'%08x'要求十六進制,8個字符寬,帶前導零。當以整數類型打印字符時,在打印之前將其擴展爲int。 –

+0

爲什麼輸出不是000000f7 –

回答

4

因爲你的系統是小端,a存儲在內存中爲F7 FF FF FF

b指向a的第一個字節。 (F7)

*b評估爲char。 (F7)

*b被提升到一個int以它作爲參數傳遞,因爲它char類型它是(通常默認爲signed char)符號擴展成爲FFFFFFF7的。

1
+-----------------------+ 
| F7 <--b=(char *) &a| 
| FF     | 
| FF     | 
| FF     | 
|      | 
+-----------------------+ 


printf("%08x",*b); 

//指:

  1. *b詢問值b指針(F7)

  2. %08x是要求十六進制,打印一個字符作爲整數型時,它是打印前擴展爲int。 (FFFFFF7現在)

+4

nope。b指向F7而不是FF – TGO

+0

@TGO對不起,這個stuip錯誤 –

+0

重要的是,你已經整理出來:) – TGO