Почему это сравнение всегда верно? - PullRequest
9 голосов
/ 01 октября 2010

В моем файле есть следующий код:

unsigned char * pData = new unsigned char...

...

if(pData[0] >= 160 && pData[0] <= 255)

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

Предупреждение: сравнение всегда верно из-за ограниченного диапазона типа данных

Как это может быть?Разве это не диапазон unsigned char 0-255?Я в замешательстве.

Ответы [ 5 ]

11 голосов
/ 01 октября 2010

Если диапазон unsigned char от 0 до 255, а pData[0] равен char, тогда pData[0] <= 255 всегда будет true.

5 голосов
/ 01 октября 2010

Выражение pData[0] <= 255 всегда истинно, поскольку диапазон unsigned char равен 0..255 (в вашей конкретной реализации).

Жаловаться только на этот бит выражений, поскольку pData[0] >= 160 можетбыть истинным или ложным.

Имейте в виду, что диапазон unsigned char не обязательно должен быть 0..255 для всех реализаций (стандарты ISO C непоручить это).

3 голосов
/ 01 октября 2010

Вторая часть сравнения избыточна.Это всегда меньше или равно 255.

0 голосов
/ 01 октября 2010

Разве не диапазон неподписанного символа 0-255

Диапазон неподписанных символов определяется реализацией (в отличие от некоторых других сообщений). Это потому, что число битов, используемых для представления символа, не всегда равно 8. Просто для вашей конкретной реализации символ занимает 1 8-битное местоположение, и, следовательно, 255 является верхним пределом.

Таким образом, в случае, если к 255 добавлено какое-то другое значение (кроме 'numeric_limits<char>::max() '), я думаю, что вам все равно следует продолжить и использовать чек, иначе проверка будет избыточной.

0 голосов
/ 01 октября 2010

Вы всегда должны ставить в скобки свои выражения, чтобы избежать двусмысленности, например:

if ((pData[0] >= 160) && (pData[0] <= 255))

Решает ли это проблему?

Второе сравнение избыточно, поэтому используйте:

if (pData[0] >= 160)
...