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