При сравнении подписанного с unsigned, компилятор преобразует подписанное значение в unsigned. Для равенства это не имеет значения, -1 == (unsigned) -1
. Для других сравнений это важно, например, верно следующее: -1 > 2U
.
РЕДАКТИРОВАТЬ: Ссылки:
5/9: (выражения)
Многие бинарные операторы, которые ожидают
операнды арифметики или перечисления
преобразование причины типа и доходность
Типы результатов аналогичным образом.
цель состоит в том, чтобы дать общий тип,
который также является типом результата.
Этот шаблон называется обычным
арифметические преобразования, которые
определяется следующим образом:
Если либо
операнд типа long double,
другие должны быть преобразованы в длинные
двойной.
В противном случае, если любой из операндов
двойной, другой должен быть
преобразован в двойной.
В противном случае, если
один операнд является плавающим, другой
должен быть преобразован в число с плавающей точкой.
В противном случае интегральные акции
(4.5) должно быть выполнено на обоих
операнды.54)
Тогда, если любой из операндов
долго не подписан, другой должен быть
преобразован в неподписанный долго.
В противном случае, если один операнд является длинным
int и другие неподписанные int, тогда
если длинный int может представлять все
значения беззнакового целого,
беззнаковое целое должно быть преобразовано в
длинный int; в противном случае оба операнда
должны быть преобразованы в неподписанные длинные
внутр.
В противном случае, если любой из операндов
долго, другой должен быть преобразован в
долго.
В противном случае, если любой из операндов
без знака, другой должен быть
преобразован в без знака.
4.7 / 2: (Интегральные преобразования)
Если тип назначения не подписан,
результирующее значение является наименьшим
целое число без знака, конгруэнтное
исходное целое число (по модулю 2 n , где n - это
количество битов, используемых для представления
тип без знака). [Примечание: в двух
дополняют представление, это
преобразование является концептуальным и есть
без изменений в битовой структуре (если есть
нет усечения). ]
EDIT2: уровни предупреждения MSVC
То, о чем предупреждают о различных уровнях предупреждений MSVC, это, конечно, выбор, сделанный разработчиками. На мой взгляд, их выбор в отношении равенства со знаком / без знака по сравнению с большим / меньшим сравнением имеет смысл, это, конечно, совершенно субъективно:
-1 == -1
означает то же самое, что и -1 == (unsigned) -1
- я считаю, что результат интуитивно понятен.
-1 < 2
не означает то же самое, что -1 < (unsigned) 2
- На первый взгляд это менее интуитивно понятно, и IMO заслуживает «более раннего» предупреждения.