Переполнение Unsigned Int
Что будет содержать unsigned int
, когда я его переполню? Чтобы быть конкретным, я хочу сделать умножение с двумя unsigned int
s: что будет в unsigned int
после завершения умножения?
unsigned int someint = 253473829*13482018273;
Ответы
Ответ 1
unsigned
числа не могут переполняться, но вместо этого обертываются с использованием свойств modulo.
Например, когда unsigned int
- 32 бита, результатом будет: (a * b) mod 2^32
.
Как отметил CharlesBailey, 253473829*13482018273
может использовать подписанное умножение перед преобразованием, поэтому вы должны быть явно о unsigned
перед умножением:
unsigned int someint = 253473829U * 13482018273U;
Ответ 2
Незнакомое целочисленное переполнение, в отличие от его подписанного аналога, демонстрирует четко определенное поведение.
Значения в основном "обертываются". Он безопасен и обычно используется для подсчета, или хеширования/мода.
Ответ 3
Вероятно, это немного зависит от вашего компилятора. У меня были ошибки, подобные этим годам назад, и иногда вы можете получить ошибку времени выполнения, в других случаях она будет в основном "обертываться" обратно на действительно небольшое число, которое могло бы быть результатом измельчения битов самого высокого уровня и оставления остатка, т.е. Если это 32 бит unsigned int, и результат вашего умножения будет 34-битным числом, он отрубит верхний бит 2-го порядка и даст вам остаток. Вам, вероятно, придется попробовать его на своем компиляторе, чтобы увидеть, что именно вы получаете, что может быть не то же самое, что вы получили бы с другим компилятором, особенно если переполнение происходит в середине выражения, где конечный результат находится в пределах диапазон беззнакового int.