'Confronto è sempre vero a causa della limitata gamma del tipo di dati' avvertimento in C?

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

  •  09-09-2019
  •  | 
  •  

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.

È stato utile?

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;
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top