С выражением x_value * y_value
значения x_value
и y_value
проходят через Обычное арифметическое преобразование , что
В противном случае подпись будет другой: еслиоперанд с беззнаковым типом имеет ранг преобразования, больший или равный рангу типа подписанного операнда, тогда операнд с подписанным типом неявно преобразуется в тип без знака
То естьзначение -12
«конвертируется» в значение без знака, и благодаря тому, как дополняет два (самый распространенный способ обработки отрицательных чисел на компьютерах), значение -12
преобразуется в очень большое значение(4294967284
точнее).
Умножение 4294967295
на 4294967284
приводит к арифметическому переполнению (поскольку это 32-разрядное умножение с 32-разрядным результатом), но оно хорошо определено для целых чисел без знака,Однако результат не будет тем, что вы ожидаете.