'Confronto è sempre vero a causa della limitata gamma del tipo di dati' avvertimento in C?
Domanda
Ho il seguente codice
//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;
}
Quando compilo questo (4.1.1 PPU-gcc), ottengo il seguente avvertimento
warning: comparison is always true due to limited range of data type
anche se l'intervallo di char è -127 a 127 e WIDTH è 8, che è ben all'interno della portata di un char. Ho già provato un cast esplicito di WIDTH ad un char, ma ancora ottenuto l'errore.
Soluzione
Sei sicuro che char
è firmato? Provate dichiarando i campi esplicitamente come signed char
e vedere quello che si ottiene.
Altri suggerimenti
Credo che x >= 0
causa l'avviso perché char
potrebbe essere implementato come unsigned char
.
Il tipo char
può essere firmato o non firmato. Dipende dalla scelta compilatore del fornitore. Ci potrebbe anche essere un opzione del compilatore a disposizione. Evidentemente, non è firmato char
per voi, quindi è sempre maggiore o uguale a zero, e quindi il compilatore che si avverte.
Si sta utilizzando char
qui per rappresentare "un tipo numerico che occupa il minimo." In tal caso, vi consiglio di utilizzare in modo esplicito o signed char
unsigned char
. (Ognuno è distinto da char
pianura, nonostante char
dover essere firmato o non firmato.) Riserva char
per quando si tiene in mano dati di caratteri. Per i dati numerici, utilizzare uno degli altri due tipi.
Hummm ... non è il tuo unsigned char di default? In tal caso la gamma sarebbe 0-255, il che significa che il tuo> = 0 confronto sarebbe sempre vero
Gli standard di C e C ++ permette il tipo di carattere char per essere firmato o non firmato, a seconda della piattaforma e compilatore. La maggior parte dei sistemi, tra cui x86 GNU / Linux e Microsoft Windows, l'uso firmato char, ma quelli basati su PowerPC e processori ARM in genere utilizzano unsigned char (29). Questo può portare a risultati imprevisti quando il porting di programmi tra le piattaforme che hanno differenti valori di default per il tipo di char.
Prova questo:
typedef struct Point
{
signed char x;
signed char y;
} Point;