2012-03-15 61 views
5

我很困惑如何在printf和一般情況下類型促銷發生。我嘗試下面的代碼printf類型促銷和簽名擴展

unsigned char uc = 255 
signed char sc = -128 

printf("unsigned char value = %d \n", uc); 
printf("signed char value = %d \n", sc); 

這給出了以下的輸出:

unsigned char value = 255 
signed char value = -128 

這給我留下了疑惑推廣實際上是如何發生的,以及是否符號擴展發生與否。如果符號擴展名已完成,則值255應作爲負值打印(-128保持不變),如果沒有符號擴展名,則-128應打印爲正值(255保持不變)。請解釋。

回答

4

如果一個符號擴展完成,則值255應打印爲負值

這是你錯了 - unsigned char類型的所有值,包括255,可以在int表示,所以從unsigned char促銷int只是沒有任何有趣的業務發生。

發生問題的情況是:有符號值必須是轉換爲(與促銷不同,它會創建操作數的通用類型)轉換爲無符號值。如果該簽名類型具有負值,則轉換爲無符號類型將更改該值。

總之,整數提升保留值(包括符號),轉換可以改變值。

2

簽名擴展完成。但是你不能簽署擴展unsigned char,因爲它沒有符號位。符號擴展的要點是保持相同的值。或者,如果您喜歡這樣想,每個無符號變量都有一個隱含的零符號位。因此,當它被擴展到更大的有符號類型時,更大類型的符號位應該爲零。

0

簽名擴展完成。

但由於uc的情況,沒有符號,因爲它是一個unsigned char,所以它是正面的。

1

兩者都被提升爲整數 - 因此保持符號。

4

va_arg函數沒有關於...部件的預期類型的​​信息。因此,在沒有原型的情況下聲明的功能的促銷規則適用這意味着所有短於int的類型都會直接提升爲intunsigned。所以你的printf函數永遠不會看到一個(un)signed char