に一致しない一定値の比較:C変数と私が持っている場合は
signed char * p;
と私は比較の操作を行います。
if (*p == 0xFF)
break;
をそれが0XFFをキャッチすることはありませんが、私はと-1それそれを置き換える場合意志:
if (*p == (signed char)0xFF)
break;
どうすればいいですか?それは旗が付いた何か?しかし、それは0xFF == -1 == 255
です。
に一致しない一定値の比較:C変数と私が持っている場合は
signed char * p;
と私は比較の操作を行います。
if (*p == 0xFF)
break;
をそれが0XFFをキャッチすることはありませんが、私はと-1それそれを置き換える場合意志:
if (*p == (signed char)0xFF)
break;
どうすればいいですか?それは旗が付いた何か?しかし、それは0xFF == -1 == 255
です。
値0xFF
は、符号付きのint値です。比較を行うときCはint
へ*p
を推進していきますので、最初のif文は同等です:もちろん偽である
if(-1 == 255) break;
。あなたが期待するように動作
if(-1 == -1) break;
:(signed char)0xFF
を使用してステートメントは同等です。ここでのポイントは、signed char
タイプの代わりにint
タイプで比較が行われることです。
0xFFで以来、最初の比較はまだあなたの文字を意味し、int型と見なされるためにそれは-128〜127ですが、0xFFではまだあなたが0xFFということを伝える第2のケースで255
あるintにキャスト実際には符号付きのcharであり、intではありません
整数リテラルはint型に署名しています。 0xFFは符号付きintなので、コンパイラは* pをsigned intに変換してから比較を行います。
* pが-1で符号付きの文字から符号付きのintに変換されても-1の場合は、0xFFFFFFFFの表現を持つ-1のままです。これは0xFFと等しくありません。
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;
0xFFでは、符号なしではなく、署名されています。 0xFFUは符号なしバージョンです。 * pのみプロモートする必要があります。 – Niall
Niall:あなたは大丈夫です。私は答えを更新します。 –