Странная оценка состояния - PullRequest
3 голосов
/ 08 ноября 2010

следующий код:

#include <stdint.h>

int main() {
    uint8_t Byte;

    if (Byte < 0) { }
}

выдает следующее предупреждение компиляции:

main.cpp: In function `int main()':
main.cpp:6: warning: comparison is always false due to limited range of data type

Это хорошо. Но когда я изменяю условие на:

(1) if (true || (Byte < 0)) { }

Я все еще получаю предупреждение, в то время как я ожидаю получить предупреждение типа "сравнение всегда верно ...":)

Если я изменю объявление байта на:

(2) uint32_t Byte;

предупреждение исчезает.

Как я могу объяснить поведение?

Моя система RHEL 5.3, 64 бит поставляется с gcc 4.1.2.

EDIT:

(1) не проблема, я просто неправильно понял предупреждение компилятора. Он не говорит, что целое if равно false , а скорее "Byte <0". </p>

Итак, проблема только в (2) - почему тип Byte вызывает предупреждение компилятора. Константа "0" имеет тип int , поэтому ее 4 байта. Так что это должно быть связано со сравнением, если uint8_t с int

1 Ответ

1 голос
/ 08 ноября 2010

При сравнении значения без знака с вашим целым числом со знаком 0, значение сначала (неявно) приводится к целому числу.Поскольку значение uint8_t находится в диапазоне от 0 до 255, оно положительно при преобразовании в 32-разрядное целое число.

С другой стороны, значение uint32_t находится в диапазоне от 0 до 2 ^ 32-1, поэтому при преобразовании в 32-bit int может обернуться и стать отрицательным (все значения, большие или равные 2 ^ 31, будут фактически преобразованы в отрицательные значения int).Итак, ваше сравнение не всегда верно, и компилятор прав.

...