我無法確定以下程序如何輸出6和-250。-250打印爲6
#include<stdio.h>
int main()
{
unsigned char p=-250;
printf("%d",p);
unsigned int p1=-250;
printf("%d",p1);
return 0;
}
作爲一個無符號整數,它只能輸出正值。p值如何輸出6?請幫助我理解。
我無法確定以下程序如何輸出6和-250。-250打印爲6
#include<stdio.h>
int main()
{
unsigned char p=-250;
printf("%d",p);
unsigned int p1=-250;
printf("%d",p1);
return 0;
}
作爲一個無符號整數,它只能輸出正值。p值如何輸出6?請幫助我理解。
printf
是沒有類型安全。它打印你要求的任何內容,並且%d
表示「有符號整數」。它是你的責任提供varibale的匹配類型。由於unsigned char
只有8位寬,文字-250繞到+6,當解釋爲有符號整數時,它仍然爲+6。請注意,當通過可變參數傳遞時,char
和short int
(及其已簽名/未簽名的對應方)全部被提升爲int
-types。
unsigned char
可能只包含數字0..255
數字轉換爲模256
。所以-250
鑄造到6
你不應該相信這種行爲。你應該避免溢出。
截至p1
,它強制轉換爲無符號整型,但因爲%d
的printf()
標識
p1
是unsigned
interpried爲P1,但%d
修改把相應的參數作爲簽約,所以儘管實際上它是正面,它被打印爲負面。
數字是否有符號或無符號都是關於應用的表示形式,在機器級別上它沒有區別。
默認情況下,integer numerals如-250
的類型爲int
。此外,負值存儲在Two's complement form的內存中。我們計算的-250二進制補碼形式(見都要進行兩個在維基補碼形式段):
250
是11111010
(第8位,領先零省略)00000101
(第8位,領先那些被省略)00000110
(第8位,領先那些省略)C中整數類型的類型轉換規則說我們應該丟棄左邊的位來獲取8位字符。有關更多詳情,請參閱K & R A.6.2(好吧,它是用於俄語版的,也許在原來的書中有另一個地方)。
所以unsigned char p
得到一個00000110
值(十進制的6
)。這就是爲什麼你輸出6。
我想,你現在明白爲什麼會出現在第二printf
-250
)
@Silver_Shost:謝謝你讓我理解。 – Angus
什麼是你的問題的標題有你的問題呢? – Mat