Почему это генерирует предупреждение компилятора «Несоответствие со знаком / неподписанным» только при компиляции под x64? - PullRequest
3 голосов
/ 11 сентября 2009

Рассмотрим этот код:

LARGE_INTEGER l;
size_t s;
if (s < l.QuadPart) return 1;
return 0;

Когда это скомпилировано в x64, оно генерирует C4018 предупреждение компилятора со знаком / без знака (игнорировать предупреждение о неинициализированной локальной переменной).

Предупреждение в порядке, поскольку QuadPart - это LONGLONG, которое подписано, а size_t - без знака.

Но когда я компилирую это под 32-битную версию, предупреждение не появляется? Как так? Под 32-битным LONGLONG все еще подписан, а size_t не подписан.

1 Ответ

12 голосов
/ 11 сентября 2009

В 32-битном LONGLONG эквивалентно signed __int64, а size_t эквивалентно unsigned int. unsigned int имеет диапазон, который полностью вписывается в диапазон signed __int64, поэтому компилятор расширяется (выполняет целочисленное продвижение) от size_t до signed __int64 перед сравнением, и никаких предупреждений нет.

В 64-битном LONGLONG снова эквивалентен signed __int64, но size_t эквивалентен unsigned __int64, поэтому теперь size_t больше не вписывается в LONGLONG, и компилятор не может выполнять какие-либо продвижение автоматически, отсюда и предупреждение.

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