Cでの警告「の比較はデータ型の範囲制限によって、常に真ですか」?
質問
私は、次のコードを持っている。
//Point.h
#define WIDTH 8
#define HEIGHT 8
typedef struct Point
{
char x;
char y;
} Point;
//Board.c
#include <stdbool.h>
// Some other functions that we don't care about...
bool inBounds(Point * p)
{
return p->x >= 0
&& p->x <= WIDTH
&& p->y >= 0
&& p->y <= HEIGHT;
}
私はこの(PPU-GCC 4.1.1)をコンパイルすると、私が手に、次の警告
warning: comparison is always true due to limited range of data type
チャーの範囲は、127 -127、幅がチャーの範囲の内側に十分であり、8であっても。私はすでに文字に対する幅の明示的なキャストを試してみましたが、それでもエラーを持っています。
解決
あなたはchar
が署名されていることを確認していますか? signed char
として明示的にフィールドを宣言してみて、あなたが得るものを見ます。
他のヒント
私はx >= 0
がchar
として実装される可能性があるためunsigned char
が警告の原因と推測します。
char
型は、符号付きまたは符号なしてもよいです。それはあなたのコンパイラベンダーの選択に依存します。でも利用できるコンパイラオプションがあるかもしれません。明らかに、char
はあなたのために署名され、それは常にゼロ以上ですので、コンパイラは警告を表示します。
あなたは表現するために、ここでchar
を使用している「最小限のメモリを占める数値型を。」その場合、私は明示的にsigned char
またはunsigned char
を使用することをお勧めします。 (それぞれ、符号付きまたは符号なしのことを有するかchar
にもかかわらず、平野char
は区別されます。)あなたは、文字データを保持しているときのためのご予約char
。数値データの場合は、他の二つのタイプのいずれかを使用します。
Hummm ...デフォルトで符号なしのあなたのcharではないでしょうか?その場合、範囲は、あなたの> = 0の比較は常にtrueになります意味0-255、だろう。
CおよびC ++の標準プラットフォームとコンパイラに依存し、符号付きまたは符号なしする文字型charを可能にします。タイプごとに異なるデフォルト値を持っているのプラットフォーム間でプログラムを移植する際、ほとんどのx86 GNU / LinuxとMicrosoft Windowsのなどのシステムでは、signed char型を使用していますが、PowerPCとARMプロセッサをベースにしたものが一般的にunsigned char型を使用します。(29)これは、予期しない結果につながることができます文字のます。
これを試してください:
typedef struct Point
{
signed char x;
signed char y;
} Point;