2011-05-09 34 views
5

我有一個需要從任何專家指導一個問題:與short類型的值作爲參數傳遞給printf()功能拼圖由C短類型提升爲int

  1. ,它會自動晉升爲int類型,這就是爲什麼printf()函數將看到的值爲int類型而不是short類型。

  2. 所以基本上short類型是16位寬,是0000000000000000int類型是32位寬,是00000000000000000000000000000000

  3. 比方說,我聲明一個變量調用numshort類型和-32的值,這意味着short類型的最顯著位初始化這將是1,這是0000000011100000

  4. 當我將該值傳遞給printf(),它會被轉換爲int類型,所以它會成爲00000000000000000000000011100000

  5. 在步驟4中,當它轉換爲int時,最高有效位爲0

  6. 爲什麼當我使用%hd說明符或甚至是%d說明符時,它仍然會提示我輸入一個負值而不是正值?

回答

2

將short轉換爲int基本上將short的最顯示位複製到int的前16位。這就是爲什麼int被打印爲負數的原因。如果你不想使用ushort這種行爲。

9

沒有,短和INT都是符號類型,所以它是由符號擴展不爲0字節填充促進:

-32 short =     11111111 11100000 
-32 int = 11111111 11111111 11111111 11100000 

離開MSB爲1,即負值。

您可以通過先輸入未簽名來僞造您期望的行爲,例如,

printf("%d", (unsigned short)((short)(-32))); 
+3

+1:在2的補碼中,這是絕對正確的。對於其他表示,會發生相同的情況。 – 2011-05-09 09:24:31

+3

奧利說什麼 - 準確地說,從「短」到「詮釋」時,數字的真正數學價值被保留。在2的補碼和1的補碼中,這意味着符號擴展。在符號幅度中,它表示符號位右側的零填充。 – 2011-05-09 09:43:36

2

正如你所說,它被轉換並在這種情況下轉換意味着knowlegde。那就是編譯器知道如何簽名short到int的轉換工作。它不只是在前面附加位,它會創建一個與短路相同的新int。這就是爲什麼你得到正確的號碼。