我们怎样才能将一个string转换为int为非常大的整数值?

我已经使用函数atoi将string转换为int ,它工作正常,但是当我给

 num = atoi (argv[1]) ; // argv contain 4294967295 maximun value of 32 bit integer 

它给我2147483647答案,这基本上是4294967295的一半

我想这是因为charint的字节的差异。 任何人都可以解释什么发生在位和字节,以及如何解决它或将其转换为int

你已经遇到了一个整数的最大值。 由于atoi返回一个int ,所以它被限制在你的机器上的一个整数的大小。 它看起来像你的机器使用32位int

如果你错过了它(很容易错过),2147483647 =(2 ^ 31) – 1.记住int s可以是负数,最左边的位是符号位。 这就是为什么你看到这个号码被“限制”到2147483647。

尝试将num定义为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 Multiple Precision,它是一个BigNum库,这意味着它有代码来处理大于32位或64位的整数。 它可以处理尽可能多的位,因为你有RAM。

要将字符串转换为整数,您可以使用GMP函数mpz_set_str()