¿La advertencia 'la comparación siempre es verdadera debido al rango limitado de tipos de datos' en C?

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

  •  09-09-2019
  •  | 
  •  

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.

¿Fue útil?

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;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top