簡體   English   中英

簽名和未簽名的字符

[英]Signed and unsigned char

為什么兩個字符如signed charunsigned char具有相同的值不相等?

char a = 0xfb; 
unsigned char b = 0xfb;
bool f;
f = (a == b); 
cout << f;

在上面的代碼中, f的值是0。
為什么當ab具有相同的值時呢?

沒有算術運算符接受小於int整數。 因此,兩個char值首先被提升為int ,有關完整詳細信息,請參閱整數提升

char在您的平台上簽名,因此0xfb被提升為int(-5) ,而unsigned char被提升為int(0x000000fb) 這兩個整數不相等。

另一方面, [basic.fundamental]中的標准要求所有char類型占用相同的存儲量並具有相同的對齊要求; 也就是說,它們具有相同的對象表示,並且對象表示的所有位都參與值表示。 因此, memcmp(&a, &b, 1) == 0true

f的值,實際上是程序的行為,是實現定義的

在C ++ 14及以上版本1中 ,對於有signed char ,假設CHAR_MAX127 ,則a可能為-5 從形式上講,如果charsigned且數字不適合char ,則轉換是實現定義的,或者引發實現定義的信號。

b251

對於比較a == b (並保留char是比int更窄的類型的假設), 兩個參數都轉換為int ,因此保留了-5251

這是false因為數字不相等。

最后,請注意,在charshortint都大小相同的平台上,代碼的結果將為true (並且==將為unsigned類型)! 故事的寓意: 不要混淆你的類型


1 C ++ 14刪除了1的補碼和簽名量級的signed char

  • (signed) char值范圍是[-128, 127] (C ++ 14作為較低范圍下降-127)。
  • unsigned char值范圍是[0, 255]

你試圖分配給兩個變量的是十進制的251 由於char無法保存該值,因此您將遇到值溢出,如以下警告所示。

警告:從'int'到'char'的轉換溢出會將值從'251'更改為''\\ 37777777773''[-Woverflow]

其結果是a可能會持有價值-5b將是251 ,他們確實是不相等的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM