2017-01-21 36 views
-2

我看到一些代碼看起來像這樣不爲0xFF等於負0:爲什麼在C++

Object *area = new Object[n]; 
memset(area, 0xff, sizeof(Object) * count); 

所以這個填充對象數組的每一個領域與1位。再後來有多個地方檢查,如果一個對象的字段尚未通過檢查〜0(負零)來填充:

const unsigned int NULL_INDEX = ~0; 
... 
if(object.field == NULL_INDEX) {...} 

該Object類的字段是unsigned int類型。我很困惑,爲什麼0xff可以被評估爲等於0,在unsigned int?我看到另一個post在2的補碼系統上談論0xff等於-1,並發現另一個post,我認爲這意味着C++程序是否將0xff解釋爲-1或〜0取決於系統?

C++中的可移植方式在填充0xff時檢查整數究竟是什麼?這應該檢查無符號int或signed int?我很困惑...

+8

'〜0'不爲負0. –

+0

〜反轉每一位。 – Phil1970

+1

最常見的表示(2的補碼)中沒有負數的整數。 – Phil1970

回答

3
~0 

所有位就設置爲1 舉例來說,如果你有32位int和使用

int all_the_ones = ~0; 

,那麼你會得到在11111111111111111111111111111111含的all_the_ones

0xff套8位爲1的值,所以對於一個32位的存儲器部分詮釋這將是00000000000000000000000011111111

無論如何,爲0xff的等於〜0上一個int,所討論的INT將需要是8bit/1字節,又名char

unsigned char a = ~0; 
signed char b = ~0; 

將給出等於255且b等於-1

在內存方面,他們倆都是11111111

我不明白爲什麼你要知道,如果0xFF的存儲在一個int,但對ab比較以上應該工作。

+0

謝謝我只是誤解了整個標誌大聲笑...... – Superziyi

+0

很高興成爲^^ – ScegfOd