Переполнение 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.