‚Vergleich ist immer wahr aufgrund der begrenzten Reichweite von Datentyp‘ Warnung in C?

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

  •  09-09-2019
  •  | 
  •  

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.

War es hilfreich?

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;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top