[英]Signed and unsigned char
為什么兩個字符如signed char
和unsigned char
具有相同的值不相等?
char a = 0xfb;
unsigned char b = 0xfb;
bool f;
f = (a == b);
cout << f;
在上面的代碼中, f
的值是0。
為什么當a
和b
具有相同的值時呢?
沒有算術運算符接受小於int
整數。 因此,兩個char值首先被提升為int
,有關完整詳細信息,請參閱整數提升 。
char
在您的平台上簽名,因此0xfb
被提升為int(-5)
,而unsigned char
被提升為int(0x000000fb)
。 這兩個整數不相等。
另一方面, [basic.fundamental]中的標准要求所有char類型占用相同的存儲量並具有相同的對齊要求; 也就是說,它們具有相同的對象表示,並且對象表示的所有位都參與值表示。 因此, memcmp(&a, &b, 1) == 0
為true
。
f
的值,實際上是程序的行為,是實現定義的 。
在C ++ 14及以上版本1中 ,對於有signed
char
,假設CHAR_MAX
為127
,則a
可能為-5
。 從形式上講,如果char
已signed
且數字不適合char
,則轉換是實現定義的,或者引發實現定義的信號。
b
是251
。
對於比較a == b
(並保留char
是比int
更窄的類型的假設), 兩個參數都轉換為int
,因此保留了-5
和251
。
這是false
因為數字不相等。
最后,請注意,在char
, short
和int
都大小相同的平台上,代碼的結果將為true
(並且==
將為unsigned
類型)! 故事的寓意: 不要混淆你的類型 。
1 C ++ 14刪除了1的補碼和簽名量級的signed char
。
char
值范圍是[-128, 127]
。 (C ++ 14作為較低范圍下降-127)。 unsigned char
值范圍是[0, 255]
你試圖分配給兩個變量的是十進制的251
。 由於char
無法保存該值,因此您將遇到值溢出,如以下警告所示。
警告:從'int'到'char'的轉換溢出會將值從'251'更改為''\\ 37777777773''[-Woverflow]
其結果是a
可能會持有價值-5
而b
將是251
,他們確實是不相等的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.