Как мы можем преобразовать строку в int для очень больших целых значений?

я использовал функцию atoi для преобразования символьных строк в int и это работает нормально, но когда я дал

num = atoi (argv[1]) ;

// argv contain 4294967295 maximun value of 32 bit integer

это дает мне ответ 2147483647, который в основном составляет половину 4294967295

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

4 ответов


вы столкнулись с максимальным значением целого числа. С atoi возвращает int, он ограничен размером целого числа на вашем компьютере. Похоже, ваша машина использует 32-бит ints.

в случае, если вы пропустили его (его легко пропустить), 2147483647 = (2 ^ 31) - 1. Запомните это ints может быть отрицательным, и самый левый бит в этом случае является битом знака. Вот почему вы видите, что число "ограничено" 2147483647.

попробовать определением num as unsigned int вместо int, и использовать strtoul вместо atoi.


использовать strtoul вместо atoi. Последнее приводит к неопределенному поведению, если значение переполняется int, что и происходит в вашем случае.


можно использовать strtoull для очень длинных чисел.

unsigned long long int strtoull(const char *nptr, char **endptr,
                                       int base);

компиляция с поддержкой C99 -std=c99 или укажите определения в man strtoull чтобы получить определение.


Если вы хотите обращаться серьезно очень большие цифры тогда вам нужна библиотека, как GMP.

GMP означает множественную точность GNU, и это библиотека BigNum, что означает, что у нее есть код для обработки целых чисел больше, чем 32 бита или 64 бита. Он может обрабатывать столько бит, сколько у вас есть ОЗУ.

чтобы преобразовать строку в целое число, вы должны использовать функцию GMP mpz_set_str()