Cでの警告「の比較はデータ型の範囲制限によって、常に真ですか」?

StackOverflow https://stackoverflow.com/questions/757482

  •  09-09-2019
  •  | 
  •  

質問

私は、次のコードを持っている。

//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 >= 0charとして実装される可能性があるため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;
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top