2013-07-24 33 views
1
char byte = 0x80 
if(byte == 0x80) 
{ 
    cout << "This message never gets printed!"; 
} 

十六進制值0x80相當於二進制到1000 0000,這明顯適合於一個字節。使用==運算符將char與0x80進行比較總是會導致錯誤?

然而,編譯器警告我關於與條件行:

warning: comparison is always false due to limited range of data type 

爲什麼在這種情況下,有條件的虛假的結果呢?

0x80在有條件擴展到像0x80000000

是否可以使用==運營商來檢查char是否等於0x80

+2

'char'可以有符號或無符號。 – chris

+0

是的。但即使'0x80'解析爲負數,我們不僅僅比較'char'的內容是否等於文字?如果沒有,請解釋! :) –

+4

@CoryKlein:'0x80'是一個'int'。 –

回答

6

的問題是,char是,在C和C++標準,定義,它可以是有符號或無符號的值,並且該一個char必須至少有8位。有問題的體系結構和編譯器似乎使用帶符號的8位char值。

這意味着最高位(位7)的任何值都將爲負值。因此0x80作爲char變成了十進制的-128。

常量0x80不是char的值,它是一個int的值。

所以,當你比較-128與0x80(128)時,它們是不一樣的,也不可能是,編譯器會計算出來併發出警告。

有各種各樣的方式來實現這一點,這裏有一些可能的情況:

首先,我們可以值強制或者其他的類型:

if (((int)byte) & 0xff == 0x80) 

if (byte == (char)0x80) 

或者,我們可以將常數轉換爲char的值,而不是int的值。

if (byte == '\200')  // Octal 200 = 0x80. 

if (byte == '\x80') 

另外,使用unsigned char byte = 0x80; - 指定它是一個無符號的字符將確保它不會「翻轉到負」。

+0

爲了完整性,我會補充說,你也可以使用'-funsigned-char'編譯(至少在clang和gcc下),這將強制所有'char'無符號。 – wds

0

signed char類型可以包含值爲0x7f-0x80,總共有256個值。 unsigned char類型可以包含值0x80,因爲最大值爲0xff。看來您正在使用的char類型的實現類型是signed char類型。

0x80指定爲signed char強制值溢出,使值爲-0x80signed char類型不能向系統表示0x80,因爲它始終被解釋爲-0x80。這是因爲最重要的位用作符號位。

如果您使用按位和:byte & 0x80,則您的比較可能會成功。請注意,此操作的結果並不意味着在任何方向上均等,僅僅是是否設置了最重要的位。

+1

'char'類型可以是有符號或無符號的,所以你的第一句話並不總是對的。 – chris

+0

更正了,謝謝。 – abiessu

+2

帶有&的測試不等於平等。 –

相關問題