int main()
{
unsigned int b;
signed int a;
char z=-1;
b=z;
a=z;
printf("%d %d",a,b);
}
給出-1 -1。爲什麼沒有符號擴展發生,另外,它什麼時候發生?理解符號擴展
int main()
{
unsigned int b;
signed int a;
char z=-1;
b=z;
a=z;
printf("%d %d",a,b);
}
給出-1 -1。爲什麼沒有符號擴展發生,另外,它什麼時候發生?理解符號擴展
符號擴展確實發生,但你打印錯誤的結果。在您的printf中,您爲b
指定了%d
,但b
未簽名,您應該使用%u
來打印b
。
printf不知道其參數的類型,並使用指定的格式來解釋它們。
printf("%d %u",a,b);
澄清:在C中不能檢查類型(這就是爲什麼我們有不同的'printf'格式說明符)。一個很好的格式說明列表可以在這裏找到(http://www.cplusplus.com/reference/clibrary/cstdio/printf/)。 – 2011-08-20 15:44:37
'printf'不會「查看原始內存」。如果你傳遞了錯誤的參數類型,它只是具有UB。例如在x86_64上,參數不在內存中,如果你傳遞了一個浮點類型,其中需要一個整數,printf將不會檢查浮點值表示的位並將它們打印爲一個整數;它會根本看不到它們。 –
那你怎麼解釋;無符號字符z = -1; printf(「%u%d」,z,z);給出相同的輸出? – nikel
「什麼是未被發現的?」:顯然是一個錯字,因爲固定。人類通常表現出更好的認知。 – Pete855217
確實發生過。如果沒有,你會看到255,255。 –
@漢斯:任何255存在的想法是令人困惑,因爲它假設一個價值模型違背C的... –