'Comparação é sempre verdadeiro, devido à gama limitada de tipo de dados' aviso em C?

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

  •  09-09-2019
  •  | 
  •  

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.

Foi útil?

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;
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top