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