ファイルに次のコードがあります。
unsigned char * pData = new unsigned char...
...
if(pData[0] >= 160 && pData[0] <= 255)
コンパイルすると、コンパイラ(gcc)から警告が表示されます。
警告:データ型の範囲が限られているため、比較は常に真です
どうすればいいの?unsigned char0〜255の範囲ではありませんか?よくわかりません。
ファイルに次のコードがあります。
unsigned char * pData = new unsigned char...
...
if(pData[0] >= 160 && pData[0] <= 255)
コンパイルすると、コンパイラ(gcc)から警告が表示されます。
警告:データ型の範囲が限られているため、比較は常に真です
どうすればいいの?unsigned char0〜255の範囲ではありませんか?よくわかりません。
の範囲がからからである場合unsigned char、0は常にに255なります。pData[0]charpData[0] <= 255true
の範囲は0..255であるため(特定の実装では) 、式pData[0] <= 255は常にtrueです。unsigned char
真または偽pData[0] >= 160になる可能性があるため、式のそのビットについて不平を言うだけです。
すべての実装でニーズの範囲unsigned charが0..255である必要はないことに注意してください(ISO C標準ではこれが義務付けられていません)。
比較の2番目の部分は冗長です。常に255以下です。
次のようなあいまいさを避けるために、常に式を括弧で囲む必要があります。
if ((pData[0] >= 160) && (pData[0] <= 255))
これで問題は解決しますか?
2番目の比較は冗長であるため、次を使用します。
if (pData[0] >= 160)
unsigned charの範囲は0〜255ではありませんか?
unsigned charの範囲は、実装によって定義されます(他のいくつかの投稿とは対照的です)。これは、charを表すために使用されるビット数が常に8であるとは限らないためです。charは特定の実装で18ビットの位置を取るため、255が上限になります。
したがって、255に('以外'numeric_limits<char>::max()の)他の意味が付加されている場合でも、先に進んでチェックを使用する必要があると思います。そうしないと、チェックが冗長になります。