Странное предупреждающее поведение при сравнении gcc и подписанных / неподписанных - PullRequest
8 голосов
/ 22 сентября 2011

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

unsigned int a;
if (a > numeric_limits<int>::max())
   do_stuff();

При компиляции gcc выдает предупреждение

: «сравнение между знаком и без знака»

Хорошо, я понимаю

Но со следующим кодом:

unsigned int a;
if (a > (numeric_limits<int>::max()))
   do_stuff();

Предупреждение больше не отображается, и я действительно не знаю почему ... Есть ли логическая причина длятакое поведение или я что-то не так делаю?!

Ответы [ 3 ]

5 голосов
/ 22 сентября 2011

Это потому, что это ошибка. См ошибка 50012

0 голосов
/ 22 сентября 2011

В настоящее время у меня нет доступа к компилятору C ++ для проверки этого, но я думаю, что это может работать без каких-либо предупреждений:

unsigned int a;
if (a > numeric_limits<unsigned int>::max())
   do_stuff();
0 голосов
/ 22 сентября 2011

Ответ заключается в том, как gcc обрабатывает int и unsigned int.

unsigned int и int, оба хранят 2-байтовое значение.Разница между ними заключается в том, что unsigned int не поддерживает отрицательные значения.Он может хранить только значения от 0 до 65 535.Когда GCC видит сравнение между int и unsigned int, он преобразует int в положительное число.Например, если значение int равно -2, оно преобразуется в 2. Но если перед int стоит оператор ().(INT).GCC интерпретирует его как положительное число (но все равно преобразует) и не выдает предупреждение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...