2009-04-16 9 views
5

Ho il seguente codice di'confronto è sempre vero a causa di un intervallo limitato di tipo di dati' avviso in C?

//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 (PPU-gcc 4.1.1), ottengo il seguente avvertimento

warning: comparison is always true due to limited range of data type 

anche se la gamma di char è -127 a 127 e WIDTH è 8, che è ben all'interno del range di un char. Ho già provato un cast esplicito di WIDTH in un carattere, ma ho ancora ottenuto l'errore.

+0

basta cambiare la tua struct a int, e vedere cosa happend? –

+0

Nel tuo caso, devi eseguire il totoi o il cast statico per xey, quindi confrontare con altezza e larghezza. –

risposta

14

Sei sicuro che lo char sia firmato? Prova a dichiarare esplicitamente i campi come signed char e guarda cosa ottieni.

+0

Sì, credo che char non sia firmato, quindi è il confronto con 0 che sarà sempre vero. – Wedge

+13

Dipende dal compilatore. Se * hai * bisogno di * char per essere firmato, devi dichiararlo come firmato. –

+0

Sì, lo risolve. Tuttavia, le righe su cui stavo ottenendo un errore erano le linee in cui stavo facendo un confronto con i numeri positivi (WIDTH e HEIGHT). Strano. –

1

Hummm ... il tuo carattere non è stato impostato per impostazione predefinita? In tal caso la gamma sarebbe 0-255, che significa che il confronto> = 0 sarebbe sempre vero

+1

Dipende dalla piattaforma e dal compilatore. Ad esempio, GCC su x86 Linux utilizza il char firmato per impostazione predefinita, mentre GCC su PowerPC Linux utilizza il char non firmato per impostazione predefinita. – ephemient

3

Credo x >= 0 causa l'avviso perché char potrebbe essere implementato come unsigned char.

3

Il tipo char può essere firmato o non firmato. Dipende dalla scelta del fornitore del compilatore. Potrebbe anche essere disponibile un'opzione per il compilatore. Evidentemente, char non è firmato per te, quindi è sempre maggiore o uguale a zero, e quindi il compilatore ti avverte.

Si sta utilizzando char qui per rappresentare "un tipo numerico che occupa memoria minima". In tal caso, raccomando esplicitamente di utilizzare signed char o unsigned char. (Ciascuno è diverso dal semplice char, nonostante char debba essere firmato o non firmato.) Prenota char per quando stai tenendo i dati dei personaggi. Per i dati numerici, utilizzare uno degli altri due tipi.

+1

confermato da: http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html – dfa

0

Gli standard C e C++ consentono di firmare o annullare il carattere del tipo di carattere, a seconda della piattaforma e del compilatore. La maggior parte dei sistemi, inclusi x86 GNU/Linux e Microsoft Windows, utilizza il char firmato, ma quelli basati su processori PowerPC e ARM in genere utilizzano il char unsigned. (29) Ciò può portare a risultati imprevisti durante il porting di programmi tra piattaforme che hanno valori di default diversi per il tipo di char.

0

Prova questo:

typedef struct Point 
{ 
    signed char x; 
    signed char y; 
} Point;