Странная оценка состояния

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

#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.

ИЗМЕНИТЬ:

(1) не проблема, я просто неправильно понял предупреждение компилятора. Он не говорит, что все if равно false, а скорее «Байт ‹ 0».

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


person dimba    schedule 08.11.2010    source источник


Ответы (1)


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

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

person F'x    schedule 08.11.2010