«Сравнение всегда верно из-за ограниченного диапазона типов данных» предупреждение в C? - PullRequest
5 голосов
/ 16 апреля 2009

У меня есть следующий код

//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;
}

Когда я компилирую это (ppu-gcc 4.1.1), я получаю следующее предупреждение

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

, даже если диапазон значений от -127 до 127, а WIDTH - 8, что находится в пределах диапазона символов. Я уже пробовал явное приведение WIDTH к символу, но все равно получил ошибку.

Ответы [ 6 ]

14 голосов
/ 16 апреля 2009

Вы уверены, что char подписано? Попробуйте объявить поля явно как signed char и посмотрите, что вы получите.

3 голосов
/ 16 апреля 2009

Тип char может быть подписанным или без знака. Это зависит от выбора вашего компилятора. Может даже быть доступна опция компилятора. Очевидно, что char для вас не подписано, поэтому оно всегда больше или равно нулю, и поэтому компилятор предупреждает вас.

Вы используете char здесь для представления «числового типа, который занимает минимальное количество памяти». В этом случае я рекомендую явно использовать signed char или unsigned char. (Каждый из них отличается от простого char, несмотря на то, что char должен быть либо подписанным, либо без знака.) Зарезервируйте char для хранения данных персонажа Для числовых данных используйте один из двух других типов.

3 голосов
/ 16 апреля 2009

Я думаю, x >= 0 вызывает предупреждение, потому что char может быть реализовано как unsigned char.

1 голос
/ 16 апреля 2009

Хммм ... разве ваш чар не подписан по умолчанию? В этом случае диапазон будет 0-255, что означает, что сравнение> = 0 будет всегда истинным

0 голосов
/ 10 апреля 2015

Попробуйте это:

typedef struct Point
{
  signed char x;
  signed char y;
} Point;
0 голосов
/ 08 апреля 2011

Стандарты C и C ++ позволяют символьному типу char быть подписанным или неподписанным, в зависимости от платформы и компилятора. В большинстве систем, включая x86 GNU / Linux и Microsoft Windows, используется подписанный символ, но в тех, которые основаны на процессорах PowerPC и ARM, обычно используется неподписанный символ. (29) Это может привести к неожиданным результатам при переносе программ между платформами, которые имеют разные значения по умолчанию для типа чар.

...