2017-05-28 65 views
1

我偶然在一個面試問題下面這段代碼,和我很好奇在這樣的情況怎麼printf的作品:printf的行爲和ASCII碼

#include <stdio.h> 
double m[]={10.711680659488273,580};  
int main() {  
m[1]--?m[0]*=2,main():printf((char*)m); 
return 0; 
} 

的問題是,你問更改數組中的初始值,以便printf函數輸出您的全名。 我很好奇printf在這種情況下的行爲。 謝謝。

+1

這家公司應該被起訴歧視 - 沒有人名字超過8個字符可以通過這個測試! – jasonharper

回答

0

在C中,字符串由它們的地址來表示。當你寫"Hello",文字你好將是「地方」在內存放,但如果你確實寫了"Hello",地址會出現(它是一個const char*)。所以,無論何時將格式字符串傳遞給printf,您都必須傳遞格式字符串的地址,即指針。在這裏,printf得到一個指針,只是它被轉換爲char*double*(當你使用一個數組變量沒有索引到它,你只得到了第一個元素的地址),但它是一個指針。文本本身來自10.711680659488273 * 2^580,並且空終止符來自0(在結尾的580處保留)。

您可以在http://www.binaryconvert.com/convert_double.html例如檢查雙的內部,並將得到的十六進制或二進制數複製到另一轉換器,像https://paulschou.com/tools/xlate/(只記得複製0X十六進制的情況下)。您可以看到很大一部分結果(LeKhal),其餘部分在執行乘法時出現。由於二進制浮點數由尾數和2的指數表示,所以它們乘以2只會改變指數。既然你已經有了轉換頁面打開,你可以跟蹤如何在指數變化的位(即簡單,它只是由1步驟,或者以總580次),以及它如何影響所產生的16位(認識到,指數不在字節邊界上開始)。

+0

謝謝,現在我明白了。 – user3708963