http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html:
- секция преобразования:
Не предупреждать о явных приведениях типа
abs ((int) x)
и ui = (unsigned)
-1
, или если значение не изменяется при преобразовании, как в abs (2.0)
.
Поскольку 2U
буквально, gcc знает, что:
- если
si < 0
, то (unsigned) si >= 2^31
, следовательно s1 != 2U
.
- если
si > 0
, то (unsigned) si
имеет то же значение, что и si
, поэтому (unsigned) si == 2U
тогда и только тогда, когда si == 2
.
В заключение, сравнение подписанного si
с литералом 2U
аналогично сравнению si
с 2
, т. Е. Результат si == 2U
не будет изменен путем преобразования si
в unsigned
.
Если вы сравните с 2 ^ 32-1 (4294967295U), самым большим 32-битным целым без знака, который не представлен в int
, тогда si
может быть равно ему, даже если si
отрицательно, это может быть не то, что вы хотели, поэтому предупреждение генерируется с опцией -Wextra
.