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