« Comparaison est toujours vrai en raison de gamme limitée de type de données » avertissement en C?
Question
Je le code suivant
//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;
}
Quand je compile ce (4.1.1 ppu-gcc), je reçois l'avertissement suivant
warning: comparison is always true due to limited range of data type
, même si l'intervalle de carbonisation est entre -127 et 127 et la largeur est 8, ce qui est bien à l'intérieur de la gamme d'un caractère. Je l'ai déjà essayé un casting explicite de WIDTH à un char, mais encore eu l'erreur.
La solution
Êtes-vous sûr que char
est signé? Essayez de déclarer les champs comme explictly signed char
et voyez ce que vous obtenez.
Autres conseils
Je suppose que x >= 0
provoque l'avertissement parce char
pourrait être mis en œuvre unsigned char
.
Le type de char
peut être signé ou non signé. Cela dépend du choix de votre fournisseur de compilateur. Il pourrait même être une option de compilateur disponible. De toute évidence, char
est non signé pour vous, il est donc toujours supérieure ou égale à zéro, et donc le compilateur vous avertit.
Vous utilisez char
ici pour représenter « un type numérique qui prend la mémoire minimale. » Dans ce cas, je recommande d'utiliser explicitement signed char
ou unsigned char
. (Chacun d'eux est distinct de char
ordinaire, en dépit char
avoir à être signé ou non signé.) Réserve char
lorsque vous tenez des données de caractère. Pour des données numériques, utilisez l'une des deux autres types.
Hummm ... est pas votre unsigned char par défaut? Dans ce cas, la gamme serait 0-255, ce qui signifie que votre> = 0 comparaison serait toujours vrai
Les normes C et C ++ permet le type de caractères char être signé ou non signé, en fonction de la plate-forme et compilateur. La plupart des systèmes, y compris x86 GNU / Linux et Microsoft Windows, utilisez signed char, mais ceux basés sur les processeurs PowerPC et ARM utilisent généralement unsigned char (29). Cela peut conduire à des résultats inattendus lors du portage des programmes entre les plates-formes qui ont différentes valeurs par défaut pour le type de charbon.
Essayez ceci:
typedef struct Point
{
signed char x;
signed char y;
} Point;