2011-08-21 29 views
1

我無法確定以下程序如何輸出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?請幫助我理解。

+1

什麼是你的問題的標題有你的問題呢? – Mat

回答

5

printf沒有類型安全。它打印你要求的任何內容,並且%d表示「有符號整數」。它是你的責任提供varibale的匹配類型。由於unsigned char只有8位寬,文字-250繞到+6,當解釋爲有符號整數時,它仍然爲+6。請注意,當通過可變參數傳遞時,charshort int(及其已簽名/未簽名的對應方)全部被提升爲int -types。

2

unsigned char可能只包含數字0..255 數字轉換爲模256。所以-250鑄造到6

你不應該相信這種行爲。你應該避免溢出。

截至p1,它強制轉換爲無符號整型,但因爲%dprintf()標識

2

p1unsigned interpried爲P1,但%d修改把相應的參數作爲簽約,所以儘管實際上它是正面,它被打印爲負面。

數字是否有符號或無符號都是關於應用的表示形式,在機器級別上它沒有區別。

3

默認情況下,integer numerals-250的類型爲int。此外,負值存儲在Two's complement form的內存中。我們計算的-250二進制補碼形式(見都要進行兩個在維基補碼形式段):

  1. 25011111010(第8位,領先零省略
  2. 補它,得到00000101(第8位,領先那些被省略
  3. 添加一個,並得到00000110(第8位,領先那些省略)

C中整數類型的類型轉換規則說我們應該丟棄左邊的位來獲取8位字符。有關更多詳情,請參閱K & R A.6.2(好吧,它是用於俄語版的,也許在原來的書中有另一個地方)。

所以unsigned char p得到一個00000110值(十進制的6)。這就是爲什麼你輸出6。

我想,你現在明白爲什麼會出現在第二printf-250

+0

@Silver_Shost:謝謝你讓我理解。 – Angus