2013-12-12 57 views

回答

4

因爲char含蓄是signed char你的平臺上。

printf("%d\n", ((int)(unsigned char)200)); 

得到

200 
+0

或者更好的是,'的printf( 「%d \ n」 個,200)的8位簽名;'。 – Lundin

+1

或者我想,如果你的心情很瘋狂,'printf(「200」);'。 – Lundin

1

數量200超出值範圍爲signed char。它以二進制補碼方式環繞到負值範圍。

很明顯,在您的平臺上,char的(隱含)簽名被定義爲signed。請注意,這不是標準要求的。如果是unsigned,你的程序將打印200有關此主題的更多閱讀:

顯然,char類型的大小是你的平臺上8位。這個數量的定義也沒有被語言規範指定。如果它更大,該程序可能會很好地打印200個,就像您預期的那樣。有關此主題的進一步閱讀:

還要注意,它不是由整數類型必須使用二進制補碼錶示的標準規定。在另一個平臺上,演員甚至可能會產生完全不同的結果。進一步閱讀:

+1

但是OP使用'char',而不是'signed char'。 char的簽名是實現定義的,所以這個答案不完整。 – Lundin

+0

我不認爲應該引用http://stackoverflow.com/q/17045231/1025391的解釋「演員甚至可能會產生完全不同的結果」。鏈接的問題是關於表示。對'T1'類型的'T1'強制轉換的語義與'T1'或'T2'的表示無關。 –

+0

@PascalCuoq我認爲現在我發現了一個更好的參考。 – moooeeeep

1

charsignedintsigned(默認情況下你的平臺上)。

(signed char)11001000 = -56小數

(signed int)0000000011001000 = 200十進制

看一看Signed number representations

+1

沒有。 char被簽名,所以當編譯器強制轉換爲int時,它會執行符號擴展,因此11001000被轉換爲11111111111111111111111111001000(對於32位int) –

+1

這仍然不正確。 'char'在他的平臺上簽名,'int'也是。 – NaotaSang

+0

此外,十六進制代碼是完全廢話。你想寫BCD還是什麼?或者「BCH」我想..二進制編碼的十六進制? – Lundin

3
  • 類型char朝向C語言的其餘部分不一致,因爲char可以是無論是簽名還是未簽名。 C標準將其定義爲實現定義的行爲,這意味着編譯器可以以任何方式實現它。您的特定編譯器似乎執行char等於signed char

  • 由於上述原因,char不應該用於其他字符串。用於算術運算是不好的做法。這樣的代碼依賴於impl.defined行爲。

  • int類型始終等於signed int。這是C標準所要求的。

  • 因此,在您的特定系統上,您編寫的代碼等於:(signed int)(signed char)200

  • 當您嘗試將值200存儲在相當於signed char的變量中時,它將溢出並被解釋爲-56(在二進制補碼系統上)。

  • 當您將包含-56的signed char投射到signed int時,您將得到-56。

0

炭是從-128〜127,從而200超出該數值範圍

相關問題