I have used the function atoi
to convert character strings to int
and it's working fine but when I gave
num = atoi (argv[1]) ;
// argv contain 4294967295 maximun value of 开发者_如何转开发32 bit integer
it's giving me 2147483647 answer which is basically half of 4294967295
i guess that its because of difference of bytes in char
and int
.
Can any one explain whats happening to bits and bytes
and how to fix it or convert it to int
You've run into the maximum value of an integer. Since atoi
returns an int
, it is limited to the size of an integer on your machine. It looks like your machine uses 32-bit int
s.
In case you missed it (it's easy to miss), 2147483647 = (2 ^ 31) - 1. Remember that int
s can be negative, and the leftmost bit is the sign bit in that case. That's why you see the number being "limited" to 2147483647.
Try defining num
as unsigned int
instead of int
, and use strtoul
instead of atoi
.
Use strtoul
instead of atoi
. The latter results in undefined behavior if the value overflows int
, which is what happens in your case.
If you want to handle seriously very large numbers then you need a library like GMP.
GMP stands for GNU Multiple Precision and it is a BigNum library, which means it has code to handle integers bigger than 32 bits or 64 bits. It can handle as many bits as you have RAM.
To convert a string into an integer you would use the GMP function mpz_set_str()
You can use strtoull
for very long numbers.
unsigned long long int strtoull(const char *nptr, char **endptr,
int base);
Compile with C99 support -std=c99
or provide the defines in man strtoull
to get the definition.
精彩评论