Я понимаю, что в отношении неявных преобразований, если у нас есть операнд без знака и операнд типа подписки, а тип неподписанного операнда такой же (или больше), как тип подписанного операнда, подписанный операнд будет преобразован в unsigned.
Итак:
unsigned int u = 10;
signed int s = -8;
std::cout << s + u << std::endl;
//prints 2 because it will convert `s` to `unsigned int`, now `s` has the value
//4294967288, then it will add `u` to it, which is an out-of-range value, so,
//in my machine, `4294967298 % 4294967296 = 2`
Что я не понимаю - я читал, что если подписанный операнд имеет больший тип, чем беззнаковый операнд:
-
если все значения в неподписанном типе подходят к большему типу, тогда неподписанный операнд преобразуется в подписанный тип
-
если значения в неподписанном типе не соответствуют более крупному типу, то подписанный операнд будет преобразован в неподписанный тип
поэтому в следующем коде:
signed long long s = -8;
unsigned int u = 10;
std::cout << s + u << std::endl;
u
будет преобразован в long long long, потому что значения int могут вписываться в долгое долгое знаком
Если это случай, то в каком сценарии меньшие значения типа не будут вписываться в более крупный?