Что выведут эти два сравнения знаковых и беззнаковых чисел?
Предскажите, что выведут два сравнения на типичной платформе с 16-битным short и 32-битным int.
short s = -1;
unsigned short us = 1;
int i = -1;
unsigned u = 1;
std::cout << (s < us) << (i < u);Определите вывод и объясните каждое сравнение.
10. short и unsigned short продвигаются до int, который вмещает все их значения, поэтому s < us — это -1 < 1, истина. int и unsigned не продвигаются: -1 преобразуется в UINT_MAX, и i < u ложно.
- Применять правило для
int/unsignedк операндамshort, забывая, что сначала идёт целочисленное продвижение доint - Ждать, что
unsigned shortпродвинется доunsigned int, раз он беззнаковый, хотяintвмещает все его значения
- На какой платформе
unsigned shortпродвинется доunsigned int, а не доint? - Почему
for (size_t i = n - 1; i >= 0; --i)зацикливается навсегда?
Перед сравнением операнды проходят два шага. Сначала целочисленное продвижение: типы, более узкие, чем int (short, unsigned short, char), становятся int, если int вмещает все их значения, как при 16-битном short и 32-битном int. Потом обычные арифметические преобразования приводят операнды к общему типу, и для int с unsigned этот тип — unsigned.
short s = -1;
unsigned short us = 1;
std::cout << (s < us); // int(-1) < int(1) → 1
int i = -1;
unsigned u = 1;
std::cout << (i < u); // 4294967295u < 1u → 0
std::cout << std::cmp_less(i, u); // C++20, -1 < 1 → 1Компилятор с -Wsign-compare предупреждает только о втором сравнении: в первом после продвижения оба операнда уже int. Сравнить знаковое и беззнаковое значения по их математической величине позволяет std::cmp_less из <utility> (C++20).