Как мы можем преобразовать строку в 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-бит int
s.
в случае, если вы пропустили его (его легко пропустить), 2147483647 = (2 ^ 31) - 1. Запомните это int
s может быть отрицательным, и самый левый бит в этом случае является битом знака. Вот почему вы видите, что число "ограничено" 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()