3 ответа

Лучший ответ

Обратное 4294967295 - 5927694924, что больше 4294967295, которое является наибольшим целым числом, которое может быть сохранено в 32-битном формате.

2
peterh 25 Апр 2014 в 08:00

Обратное значение 4294967295 равно 5927694924, что превышает диапазон unsigned int

В вашей системе unsigned int имеет ширину 32-bit, поэтому максимальное значение, которое может представлять unsigned int, равно 4294967295, то есть 0xFFFFFFFF. Вот почему ваш результат переполняется, и все, что остается в битах 32, отображается как вывод.

Если вы представляете 5927694924 в шестнадцатеричном формате, это 0x16151724C, у которого есть дополнительный 33rd бит 1, который отбрасывается и, следовательно, выводится 0x6151724C, который равен 1632727628 в десятичном формате.

Чтобы распечатать его на экране, вам понадобится больший тип данных, например unsigned long long или uint64_t или unsigned long (только в 64-битных системах), независимо от того, что ваш компилятор поддерживает для 64 битовых целых чисел. .

7
Don't You Worry Child 25 Апр 2014 в 08:05

Проблема в том, что когда я ввожу 4294967295, будет выведено 1632727628. Почему?

unsigned int может хранить 2^32-1 макс. Обратной стороной 4294967295 является 5927694924, что намного больше, чем 2^32-1. Следовательно, выход равен 1632727628. 1632727628 на самом деле 5927694924 % 4294967296

Чтобы решить эту проблему, вы должны были использовать unsigned long it. Но опять же, если число больше, чем наивысшее, оно снова переполнится.

2
Shiplu Mokaddim 25 Апр 2014 в 08:03