¿La advertencia 'la comparación siempre es verdadera debido al rango limitado de tipos de datos' en C?
Pregunta
Tengo el siguiente código
//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;
}
Cuando compilo esto (ppu-gcc 4.1.1), aparece la siguiente advertencia
warning: comparison is always true due to limited range of data type
a pesar de que el rango de caracteres es de -127 a 127 y el ANCHO es 8, que está dentro del rango de un carácter.Ya probé una conversión explícita de WIDTH a un carácter, pero aún aparece el error.
Solución
¿Está seguro de que char
está firmado? Intenta declarar los campos explícitamente como signed char
y ver lo que hay.
Otros consejos
supongo x >= 0
hace que la advertencia porque char
podría ser implementado como unsigned char
.
El tipo char
puede ser con o sin signo. Depende de la elección de su proveedor compilador. Incluso podría ser una opción del compilador disponible. Evidentemente, char
no está firmado por usted, por lo que es siempre mayor o igual a cero, y por lo tanto el compilador le advierte.
Usted está utilizando char
aquí para representar "un tipo numérico que toma el mínimo de memoria." En ese caso, recomiendo explícitamente mediante signed char
o unsigned char
. (Cada uno es distinto de char
normal, a pesar de tener que ser char
ya sea con o sin signo.) Reserva char
para cuando usted está sosteniendo los datos de caracteres. Para datos numéricos, utilice uno de los otros dos tipos.
Hummm ... no es su unsigned char por defecto? En ese caso, el rango sería 0-255, lo que significa que su> = 0 comparación sería siempre verdad
Los estándares C y C++ permiten que el tipo de carácter char esté firmado o sin firmar, según la plataforma y el compilador.La mayoría de los sistemas, incluidos x86 GNU/Linux y Microsoft Windows, usan caracteres firmados, pero aquellos basados en procesadores PowerPC y ARM generalmente usan caracteres sin firmar.(29) Esto puede conducir a resultados inesperados al portar programas entre plataformas que tienen diferentes valores predeterminados para el tipo. de carbón.
Prueba esto:
typedef struct Point
{
signed char x;
signed char y;
} Point;