2011-08-20 59 views
3
int main() 
{ 
    unsigned int b; 
    signed int a; 
    char z=-1; 
    b=z; 
    a=z; 
    printf("%d %d",a,b); 
} 

給出-1 -1。爲什麼沒有符號擴展發生,另外,它什麼時候發生?理解符號擴展

+0

「什麼是未被發現的?」:顯然是一個錯字,因爲固定。人類通常表現出更好的認知。 – Pete855217

+2

確實發生過。如果沒有,你會看到255,255。 –

+1

@漢斯:任何255存在的想法是令人困惑,因爲它假設一個價值模型違背C的... –

回答

10

符號擴展確實發生,但你打印錯誤的結果。在您的printf中,您爲b指定了%d,但b未簽名,您應該使用%u來打印b

printf不知道其參數的類型,並使用指定的格式來解釋它們。

printf("%d %u",a,b); 
3

因爲printf看着原始記憶,而不是類型。使用%u以無符號值打印該值。

參見。

http://ideone.com/Qpcbg

+0

澄清:在C中不能檢查類型(這就是爲什麼我們有不同的'printf'格式說明符)。一個很好的格式說明列表可以在這裏找到(http://www.cplusplus.com/reference/clibrary/cstdio/printf/)。 – 2011-08-20 15:44:37

+1

'printf'不會「查看原始內存」。如果你傳遞了錯誤的參數類型,它只是具有UB。例如在x86_64上,參數不在內存中,如果你傳遞了一個浮點類型,其中需要一個整數,printf將不會檢查浮點值表示的位並將它們打印爲一個整數;它會根本看不到它們。 –

+0

那你怎麼解釋;無符號字符z = -1; printf(「%u%d」,z,z);給出相同的輸出? – nikel