2014-04-25 1 views
1

Я пытаюсь написать программу для обратного ввода номера пользователя.обратный номер для max unsigned int

Диапазон ввода пользователя от 0 < < 4294967295, здесь EDITED код.

unsigned long int reverseNumber(unsigned long int num) 
{ 
    unsigned long int rev = 0; 

    while (num > 0) 
    { 
     rev = rev *10 + (num%10); 
     num = num/10; 
    } 

    return rev; 
} 

Проблема заключается в том, когда я вход 4294967295, он будет выводить 1632727628. Почему? Я понятия не имею, почему это произошло. Как можно отменить 4294967295.

Я изменил его на unsigned long int, printf, используя% lu, но все же вывод 1632727628. Почему?

+4

происходит переполнение целого числа – thumbmunkeys

+0

Просто преобразуйте int в массив символов и распечатайте его с конца, чтобы начать. – someuser

+0

Но я меняю его на unsigned long int, он все равно выводит один и тот же ответ. Зачем? – user2301281

ответ

2

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

+0

Но я меняю его на unsigned long int, он все равно выводит один и тот же ответ. Зачем? – user2301281

+2

@ user2301281 Потому что 'unsigned long int' равно 32 бит.Вам нужно перейти на 'unsigned long long int', это 64 бит. – peterh

+0

Нет, я перехожу на unsigned long long int it output 547093574220. – user2301281

7

На оборотной стороне 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 битных целых чисел.

+0

Спасибо за напоминание, я забыл об этом. – user2301281

+1

Нет, это не просто вычитание (в этом случае результат может быть таким же). Фактически это модуль, т. Е. '5927694924% 4294967295'. –

+0

Получил, спасибо всем вам !! = D – user2301281

2

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

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

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

+0

только для 32-битных систем – thumbmunkeys

+0

Но я меняю его на unsigned long int, он все равно выводит один и тот же ответ. Зачем? – user2301281

+0

@ user2301281 Поскольку 'unsigned long' обычно совпадает с' unsigned int' –

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