'Comparação é sempre verdadeiro, devido à gama limitada de tipo de dados' aviso em C?
Pergunta
Eu tenho o seguinte 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;
}
Quando eu compilar este (PPU-gcc 4.1.1), eu recebo o seguinte aviso
warning: comparison is always true due to limited range of data type
embora a gama de char é -127 a 127 e a largura é de 8, o que está bem dentro da gama de um carvão animal. Eu já tentei uma conversão explícita de largura para um char, mas ainda tenho o erro.
Solução
Você tem certeza que char
é assinado? Tente declarando os campos explicitamente como signed char
e ver o que você recebe.
Outras dicas
Eu acho que x >= 0
faz com que o aviso porque char
pode ser implementado como unsigned char
.
O tipo char
pode ser assinado ou não assinado. Ele depende da escolha do seu fornecedor compilador. Pode até ser uma opção do compilador disponível. Evidentemente, char
não está assinado por você, por isso é sempre maior ou igual a zero, e, portanto, o compilador avisa.
Você está usando char
aqui para representar "um tipo numérico que ocupa memória mínima." Nesse caso, eu recomendo explicitamente usando signed char
ou unsigned char
. (Cada um é distinto do char
simples, apesar char
ter que ser assinados ou não assinados.) Reserve char
para quando você está segurando dados de caracteres. Para dados numéricos, use um dos outros dois tipos.
Hummm ... não é o seu unsigned char por padrão? Nesse caso, a faixa seria 0-255, o que significa que o seu> = 0 comparação seria sempre verdadeiro
A C e padrões C ++ permite que o tipo de caractere char para ser assinado ou não assinado, dependendo da plataforma e compilador. A maioria dos sistemas, incluindo x86 GNU / Linux e Microsoft Windows, uso assinado char, mas aqueles baseados em processadores PowerPC e ARM costumam usar unsigned char (29). Isso pode levar a resultados inesperados quando portar programas entre as plataformas que têm padrões diferentes para o tipo de Char.
Tente isto:
typedef struct Point
{
signed char x;
signed char y;
} Point;