2009-04-16 13 views
5

Tengo el siguiente código'la comparación es siempre cierta debido al tipo limitado de tipo de datos' de advertencia en 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; 
} 

Cuando compilo este (PPU-gcc 4.1.1), me sale el siguiente mensaje de advertencia

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

a pesar de que el rango de char es entre -127 y 127 y WIDTH es 8, que está dentro del rango de un char. Ya he probado un lanzamiento explícito de WIDTH a un char, pero aún así recibí el error.

+0

acaba de cambiar su estructura a int, y ver lo que sucedió? –

+0

En su caso, necesita atoi o molde estático para xey, luego compare con la altura y el ancho. –

Respuesta

14

¿Estás seguro de que char está firmado? Intente declarar los campos explícitamente como signed char y vea lo que obtiene.

+0

Sí, creo que el carácter no está firmado, por lo que la comparación con 0 siempre será cierta. – Wedge

+13

Es dependiente del compilador. Si * necesita * char para firmar, debe declararlo como firmado. –

+0

Sí, lo arregla. Sin embargo, las líneas en las que recibí un error fueron las líneas donde estaba haciendo una comparación con números positivos (ANCHURA y ALTURA). Extraño. –

1

Hummm ... ¿no está su char sin firmar por defecto? En ese caso, el rango sería 0-255, lo que significa que su comparación> = 0 sería siempre verdad

+1

Depende de la plataforma y del compilador. Por ejemplo, GCC en x86 Linux usa char firmado por defecto, mientras que GCC en PowerPC Linux usa char sin signo por defecto. – ephemient

3

supongo x >= 0 hace que la advertencia porque char podría implementarse como unsigned char.

3

El tipo char puede estar firmado o no. Depende de la elección del proveedor del compilador. Incluso podría haber una opción de compilación disponible. Evidentemente, char no está firmado, por lo que siempre es mayor o igual que cero y, por lo tanto, el compilador lo advierte.

Está utilizando char aquí para representar "un tipo numérico que ocupa una memoria mínima". En ese caso, recomiendo usar explícitamente signed char o unsigned char. (Cada uno es distinto del normal char, a pesar de que char debe estar firmado o sin firmar). Reserve char para cuando tenga datos de caracteres. Para datos numéricos, use uno de los otros dos tipos.

+1

esto es confirmado por: http://www.network-theory.co.uk/docs/gccintro/gccintro_71.html – dfa

0

Los estándares C y C++ permiten que el tipo de carácter char sea firmado o no, dependiendo de la plataforma y el compilador. La mayoría de los sistemas, incluidos x86 GNU/Linux y Microsoft Windows, utilizan char firmado, pero los basados ​​en procesadores PowerPC y ARM suelen utilizar char sin signo. (29) Esto puede generar resultados inesperados al transferir programas entre plataformas que tienen valores predeterminados diferentes para el tipo de char

0

Prueba esto:

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