2017-01-21 7 views
-2

が、私はこのように見ていくつかのコードを見たん:その後、後でオブジェクトのフィールドかどうかをチェックする複数の場所がありますので、これはビット1とオブジェクト配列のすべてのフィールドを埋めはなぜC++で0負に等しい0xffの

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

〜0(負のゼロ)をチェックすることによってまだ満たされていません。

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

このオブジェクトクラスのフィールドは符号なしint型です。私は、0xffがunsigned intの〜0と等しいと評価できるのは混乱していますか?私は別のpostが2の補数系で-1と等しい0xffを話すのを見て、別のpostを見つけました。これは、C++プログラムが0xffを-1または0に解釈するかどうかはシステムに依存するということですか?

0xffで埋め尽くされたときに整数をチェックする移植可能な方法は何ですか?これは、unsigned intまたはsigned intに対してチェックする必要がありますか?私はとても困惑している...

+8

'〜0'は負ではありません。0 –

+0

〜すべてのビットを反転します。 – Phil1970

+1

最も一般的な表現(2の補数)の整数には負の0はありません。 – Phil1970

答えて

3
~0 

はちょうどあなたが32ビットのint型を持っていて、

int all_the_ones = ~0; 

を使用するならば、あなたは11111111111111111111111111111111を取得したい、例えば1 にすべてのビットをセットします1 all_the_ones

0xffセット8ビットの値を含むメモリの一部、32ビットINTことが00000000000000000000000011111111

であろうように

とにかく、int型に〜0に等しくなるように0xffのために、問題のint型は別名char

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

は255に等しく、-1

等しいBを与えるだろう、8ビット/ 1バイトである必要がありますメモリで

は、彼らはあなたが0xffではint型に格納されていたかどうかを知りたいと思い、なぜ私は理解していないの両方11111111

だが、動作するはずです上記aまたはbと比較します。

+0

ありがとう私はちょうど全体の笑い声を誤解... – Superziyi

+0

喜んで助けになる^^ – ScegfOd

関連する問題