2008-09-14 14 views
8

に一致しない一定値の比較:C変数と私が持っている場合は

signed char * p; 

と私は比較の操作を行います。

if (*p == 0xFF) 
    break; 

をそれが0XFFをキャッチすることはありませんが、私はと-1それそれを置き換える場合意志:

if (*p == (signed char)0xFF) 
    break; 

どうすればいいですか?それは旗が付いた何か?しかし、それは0xFF == -1 == 255です。

答えて

29

0xFFは、符号付きのint値です。比較を行うときCはint*pを推進していきますので、最初のif文は同等です:もちろん偽である

if(-1 == 255) break; 

。あなたが期待するように動作

if(-1 == -1) break; 

(signed char)0xFFを使用してステートメントは同等です。ここでのポイントは、signed charタイプの代わりにintタイプで比較が行われることです。

+0

0xFFでは、符号なしではなく、署名されています。 0xFFUは符号なしバージョンです。 * pのみプロモートする必要があります。 – Niall

+0

Niall:あなたは大丈夫です。私は答えを更新します。 –

2

0xFFで以来、最初の比較はまだあなたの文字を意味し、int型と見なされるためにそれは-128〜127ですが、0xFFではまだあなたが0xFFということを伝える第2のケースで255

あるintにキャスト実際には符号付きのcharであり、intではありません

4

整数リテラルはint型に署名しています。 0xFFは符号付きintなので、コンパイラは* pをsigned intに変換してから比較を行います。

* pが-1で符号付きの文字から符号付きのintに変換されても-1の場合は、0xFFFFFFFFの表現を持つ-1のままです。これは0xFFと等しくありません。

1

0xffは整数の定数として見なされ、値は255です。これらの種類の違いについては、常に注意が必要です。 、とにかく

 
if(*p == (signed char)0xFF) break; 

次の文は同じように動作しないということを注意してください:あなたは、コンパイラは、右のコードを生成することを確認したい場合は、型キャストを使用する必要があります

 
if((int)*p == 0xFF) break; 

また、多分署名した文字を避けるために、良いアイデアだろう、あるいは、それあなたがそのようなこの場合は-1として符号付きの値とそれらを比較するために、署名した文字を使用する必要があります。

 
if(*p == -1) break; 

0xFFで== - これらの値は、いくつかの文字(またはunsigned char型)に割り当てられる場合にのみ1を変数:

 
char a=0xff; 
char b=-1; 
if(a==b) break; 
関連する問題