2012-02-08 4 views
15

Что будет содержать unsigned int, когда я переполню его? Чтобы быть конкретным, я хочу сделать умножение с двумя unsigned int s: что будет в unsigned int после завершения умножения?Переполнение Unsigned Int

unsigned int someint = 253473829*13482018273; 
+0

Это похоже на дубликат http://stackoverflow.com/questions/199333/best-way-to-detect-integer-overflow-in-c-c –

+1

Почему бы не попробовать и посмотреть, что вы получаете? В общем случае, когда неподписанный int переполняется, он переходит к нулю. Таким образом, 'UINT_MAX + 5' свертывается и становится 4. –

+0

Это будет разница между максимальным значением uint и значением того, что было бы значением переполнения. Давайте сделаем это простым. Допустим, что max uint равно 5. Вы хотите добавить 2 * 4, поэтому это делает окончательное значение 3 вместо 8. –

ответ

22

unsigned число не может переполнить, но вместо того, чтобы обернуть вокруг используя свойства по модулю.

Например, если unsigned int - 32 бита, результатом будет: (a * b) mod 2^32.


Как CharlesBailey отметил, 253473829*13482018273 может использовать подписанное умножение перед преобразованием, и поэтому вы должны быть четко о unsigned до умножения:

unsigned int someint = 253473829U * 13482018273U; 
+0

- это часть стандарта? –

+2

@Zhenya Да, в C и C++. – Pubby

+0

@ Женья - Это имеет значение? Ответ на 100% правильный. Его более технический способ сказать UINT_MAX + 5 равен 4. Это, вероятно, останется верным и на языках .NET, и на Java. По крайней мере, в случае .NET NaN ограничено такими типами, как double, где значение (большую часть времени) не представлено точно. –

5

Unsigned целочисленного переполнения, в отличии от его Подписанного экземпляра, выставок четкое поведение.

Ценности в основном «обертываются» вокруг. Это безопасно и обычно используется для подсчета или хэширования/мода.

+3

Unsigned не переполняется –

+1

Я имел в виду, что в качестве сравнения попытаюсь объяснить это, связав что-то подобное. Я сделал квалификацию моего заявления позже с оберткой вокруг бит. О техничности. – evandrix

-3

Возможно, это немного зависит от вашего компилятора. У меня были ошибки, подобные этим годам назад, и иногда вы можете получить ошибку времени выполнения, иначе в противном случае она будет полностью «обернуться» на действительно небольшое число, которое будет результатом измельчения битов самого высокого уровня и оставления остатка, т. Е. Если это 32 бит unsigned int, и результат вашего умножения будет 34-битным числом, он отрубит верхний бит 2-го порядка и даст вам остаток. Вам, вероятно, придется попробовать его на своем компиляторе, чтобы увидеть, что именно вы получаете, что может быть не то же самое, что вы получили бы с другим компилятором, особенно если переполнение происходит в середине выражения, где конечный результат находится в пределах диапазон беззнакового int.

+0

** Переполнение без подписи ** не зависит от компилятора, оно стандартизировано, чтобы иметь семантику обертки. Это только ** подписано ** переполнение, что приводит к неопределенным значениям и, следовательно, может зависеть от компилятора. – cmaster

Смежные вопросы