При порівнянні підписаного з непідписаним компілятор перетворює підписане значення у беззнакове. Для рівності, це не має значення, -1 == (unsigned) -1
. Для інших порівнянь це важливо, наприклад , справедливо наступне: -1 > 2U
.
EDIT: Список літератури:
5/9: (вирази)
Багато двійкові оператори, які очікують операнди арифметичного чи перелічувального типу, спричиняють перетворення і видають типи результатів подібним чином. Метою є отримання загального типу, який також є типом результату. Цей шаблон називається звичайними арифметичними перетвореннями, які визначаються наступним чином:
Якщо один з операндів має тип long double, інший повинен бути перетворений у long double.
В іншому випадку, якщо будь-який операнд подвійний, інший повинен бути перетворений у подвійний.
В іншому випадку, якщо будь-який операнд є плаваючим, інший повинен бути перетворений у плаваючий.
В іншому випадку цілісні акції (4.5) повинні виконуватися на обох операндах. 54)
Потім, якщо будь-який операнд не має знака довгий, інший повинен бути перетворений у довгий без знака.
В іншому випадку, якщо один операнд - це довгий int, а інший - беззнаковий int, то, якщо довгий int може представляти всі значення беззнакового int, беззнаковий int повинен бути перетворений у довгий int; інакше обидва операнди повинні бути перетворені в беззнакові long int.
В іншому випадку, якщо будь-який операнд довгий, інший повинен бути перетворений у довгий.
В іншому випадку, якщо будь-який операнд не має знака, інший повинен бути перетворений у беззнаковий.
4.7 / 2: (інтегральні перетворення)
Якщо тип призначення без знака, отримане значення є найменш цілим числом без знака, що відповідає цілому числу джерела (за модулем 2 n, де n - кількість бітів, що використовується для представлення типу без знака). [Примітка: У поданні доповнення двох, це перетворення є концептуальним, і в бітовій схемі не змінюється (якщо немає усічення). ]
EDIT2: рівні попередження MSVC
Те, про що попереджають на різних рівнях попередження MSVC - це, звичайно, вибір розробників. Як я бачу, їх вибір щодо підписаної / непідписаної рівності проти більших / менших порівнянь має сенс, звичайно, це цілком суб’єктивно:
-1 == -1
означає те саме, що -1 == (unsigned) -1
- я вважаю, що це інтуїтивний результат.
-1 < 2
не означає те саме, що -1 < (unsigned) 2
- Це на перший погляд менш інтуїтивно, і ІМО заслуговує на попереднє попередження.