我已经使用函数atoi
将string转换为int
,它工作正常,但是当我给
num = atoi (argv[1]) ; // argv contain 4294967295 maximun value of 32 bit integer
它给我2147483647答案,这基本上是4294967295的一半
我想这是因为char
和int
的字节的差异。 任何人都可以解释什么发生在位和字节,以及如何解决它或将其转换为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()