此代碼打印-56
,我不知道爲什麼有人可以告訴我爲什麼這個程序打印-56嗎?
#include<stdio.h>
main()
{
printf("%d\n", ((int)(char)200));
}
此代碼打印-56
,我不知道爲什麼有人可以告訴我爲什麼這個程序打印-56嗎?
#include<stdio.h>
main()
{
printf("%d\n", ((int)(char)200));
}
因爲char
含蓄是signed char
你的平臺上。
做
printf("%d\n", ((int)(unsigned char)200));
得到
200
數量200超出值範圍爲signed char
。它以二進制補碼方式環繞到負值範圍。
很明顯,在您的平臺上,char
的(隱含)簽名被定義爲signed
。請注意,這不是標準要求的。如果是unsigned
,你的程序將打印200有關此主題的更多閱讀:
顯然,char
類型的大小是你的平臺上8位。這個數量的定義也沒有被語言規範指定。如果它更大,該程序可能會很好地打印200個,就像您預期的那樣。有關此主題的進一步閱讀:
還要注意,它不是由整數類型必須使用二進制補碼錶示的標準規定。在另一個平臺上,演員甚至可能會產生完全不同的結果。進一步閱讀:
char
是signed
和int
是signed
(默認情況下你的平臺上)。
(signed char)11001000
= -56小數
(signed int)0000000011001000
= 200十進制
類型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。
炭是從-128〜127,從而200超出該數值範圍
或者更好的是,'的printf( 「%d \ n」 個,200)的8位簽名;'。 – Lundin
或者我想,如果你的心情很瘋狂,'printf(「200」);'。 – Lundin