‚Vergleich ist immer wahr aufgrund der begrenzten Reichweite von Datentyp‘ Warnung in C?
Frage
Ich habe den folgenden Code
//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;
}
Wenn ich diese (PPU-gcc 4.1.1) kompilieren, erhalte ich die folgende Warnung
warning: comparison is always true due to limited range of data type
obwohl der Bereich von char -127 bis 127 und WIDTH ist 8, die auch innerhalb des Bereichs eines char ist. Ich habe bereits versucht, eine explizite Umwandlung von WIDTH auf einen char, aber immer noch den Fehler.
Lösung
Sind Sie sicher, dass char
unterzeichnet? Versuchen Sie, die Felder explictly als signed char
erklärt und sehen, was Sie erhalten.
Andere Tipps
Ich denke, x >= 0
die Warnung verursacht, weil char
könnte als unsigned char
umgesetzt werden.
Der char
Typ kann mit oder ohne Vorzeichen werden. Es hängt von Ihrem Compiler Anbieter Wahl. Es könnte sogar eine Compiler-Option zur Verfügung. Offensichtlich char
ist ohne Vorzeichen für Sie, es ist also immer größer oder gleich Null ist, und damit der Compiler warnt Sie.
Sie verwenden char
hier, um „einen numerischen Typen, die minimalen Speicher in Anspruch nimmt.“ In diesem Fall empfehle ich ausdrücklich signed char
oder unsigned char
. (Jeder unterscheidet sich von einfachen char
trotz char
, die entweder mit oder ohne Vorzeichen werden.) Reserve char
für, wenn Sie Zeichendaten der Hand halten. Für numerische Daten, verwenden Sie eine der beiden anderen Typen.
Hummm ... ist nicht Ihre char standardmäßig unsigned? In diesem Fall wäre der Bereich von 0-255, die Ihre> = 0 Vergleichsmittel würden immer wahr sein
Die C- und C ++ Standards ermöglichen es der Zeichentyp char mit oder ohne Vorzeichen wird, abhängig von der Plattform und Compiler. Die meisten Systeme, einschließlich x86 GNU / Linux und Microsoft Windows, verwendet signed char, aber solche auf Basis von PowerPC und ARM-Prozessoren verwenden in der Regel unsigned char (29). Dies zu unerwarteten Ergebnissen führen kann, wenn Programme zwischen den Plattformen zu portieren, die für den Typen unterschiedliche Standardwerte haben Saiblings.
Versuchen Sie folgendes:
typedef struct Point
{
signed char x;
signed char y;
} Point;