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

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

num = atoi (argv[1]) ;

// argv contain 4294967295 maximun value of 32 bit integer

, это дает мне 2147483647 ответ, что в основном составляет половину от 4294967295

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

Ответы [ 4 ]

5 голосов
/ 08 октября 2011

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

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

Попробуйте определить num как unsigned int вместо int и использовать strtoul вместо atoi.

2 голосов
/ 08 октября 2011

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

1 голос
/ 09 декабря 2014

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

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

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

0 голосов
/ 08 октября 2011

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

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

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

...