9

ファイルに次のコードがあります。

unsigned char * pData = new unsigned char...

...

if(pData[0] >= 160 && pData[0] <= 255)

コンパイルすると、コンパイラ(gcc)から警告が表示されます。

警告:データ型の範囲が限られているため、比較は常に真です

どうすればいいの?unsigned char0〜255の範囲ではありませんか?よくわかりません。

4

5 に答える 5

11

の範囲がからからである場合unsigned char0は常にに255なります。pData[0]charpData[0] <= 255true

于 2010-10-01T03:08:33.393 に答える
5

の範囲は0..255であるため(特定の実装では) 、式pData[0] <= 255は常にtrueです。unsigned char

真またはpData[0] >= 160になる可能性があるため、式のそのビットについて不平を言うだけです。

すべての実装でニーズの範囲unsigned charが0..255である必要はないことに注意してください(ISO C標準ではこれが義務付けられていません)。

于 2010-10-01T03:08:33.970 に答える
3

比較の2番目の部分は冗長です。常に255以下です。

于 2010-10-01T03:08:39.760 に答える
0

次のようなあいまいさを避けるために、常に式を括弧で囲む必要があります。

if ((pData[0] >= 160) && (pData[0] <= 255))

これで問題は解決しますか?

2番目の比較は冗長であるため、次を使用します。

if (pData[0] >= 160)
于 2010-10-01T03:09:29.320 に答える
0

unsigned charの範囲は0〜255ではありませんか?

unsigned charの範囲は、実装によって定義されます(他のいくつかの投稿とは対照的です)。これは、charを表すために使用されるビット数が常に8であるとは限らないためです。charは特定の実装で18ビットの位置を取るため、255が上限になります。

したがって、255に('以外'numeric_limits<char>::max()の)他の意味が付加されている場合でも、先に進んでチェックを使用する必要があると思います。そうしないと、チェックが冗長になります。

于 2010-10-01T03:23:22.417 に答える