предупреждение «сравнение всегда верно из-за ограниченного диапазона типов данных» в C?

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

  •  09-09-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Другие советы

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

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

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

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

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

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

typedef struct Point
{
  signed char x;
  signed char y;
} Point;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top