9

次のコードがあります

//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

char の範囲は -127 から 127 で、WIDTH は 8 ですが、これは十分に char の範囲内です。WIDTH を char に明示的にキャストしようとしましたが、それでもエラーが発生します。

4

6 に答える 6

16

それcharは署名されていますか?フィールドを明示的に宣言してみて、signed char何が得られるかを確認してください。

于 2009-04-16T18:42:36.480 に答える
4

として実装されている可能性があるx >= 0ため、警告が発生すると思います。charunsigned char

于 2009-04-16T18:47:21.273 に答える
3

char型は符号付きまたは符号なしの場合があります。コンパイラ ベンダーの選択によって異なります。利用可能なコンパイラ オプションさえあるかもしれません。明らかに、char署名されていないため、常にゼロ以上であるため、コンパイラは警告します。

charここでは、「最小限のメモリを消費する数値型」を表すために使用しています。その場合、signed charorを明示的に使用することをお勧めしunsigned charます。(署名付きまたは署名なしのいずれかである必要がありますが、それぞれが plain とは異なります。) 文字データを保持している場合に備えて予約charしてください。数値データの場合は、他の 2 つのタイプのいずれかを使用します。charchar

于 2009-04-16T18:54:33.457 に答える
1

うーん...あなたのcharはデフォルトで署名されていませんか?その場合、範囲は 0 ~ 255 になります。つまり、>=0 の比較は常に true になります。

于 2009-04-16T18:43:03.343 に答える
0

C および C++ 標準では、プラットフォームとコンパイラに応じて、文字型 char を符号付きまたは符号なしにすることができます。x86 GNU/Linux および Microsoft Windows を含むほとんどのシステムは、signed char を使用しますが、PowerPC および ARM プロセッサに基づくシステムは通常、unsigned char を使用します。チャーの。

于 2011-04-07T22:27:13.773 に答える
0

これを試して:

typedef struct Point
{
  signed char x;
  signed char y;
} Point;
于 2015-04-10T16:57:00.220 に答える