我有以下代码:
char* input = (char*)malloc(sizeof(char) * BUFFER) // buffer is defined to 100
int digit = atoi(input); // convert char into a digit
int digit_check = 0;
digit_check += digit % 10; // get last value of digit当我运行输入1234567896和类似的数字= 1234567896和digit_check = 6时。
但是,当我运行输入9999999998时,数字= 1410065406,因此,当输入为8时,digit_check =6。
对于第二个例子,为什么输入和数字之间有区别,而它应该是相同的值?
发布于 2015-03-30 14:41:30
atoi仅限于int大小(在最近的平台上为32位)。
如果您想处理大量数字,可以使用atol或scanf("%ld")。
不要忘记将变量键入到long int (或long)。
您还可以只获取输入的最后一个字符(收集为字符串而不是int)并在其上使用atoi,这样它就不会溢出。
发布于 2015-03-30 14:42:29
可能是因为9999999998比最大(有符号)整数表示要大,所以会有溢出。
实际上,这是9999999998和1410065406的二进制表示:
10 01010100 00001011 11100011 11111110
01010100 00001011 11100011 11111110如您所见,如果您看到1410065406是32ed位值9999999998。
发布于 2015-03-30 14:44:19
在许多平台上,int的大小被限制为4个字节,这限制了[-2 ** 31, 2**31 - 1]中的数字。
根据构建平台的不同,将long (或long long)与strtol (或strtoll)结合使用。例如,GCC在x86上将有64位long long,而对于amd64,它将有64位long和long long类型。
所以:
long long digit = strtoll(input, NULL, 10);注意:strtoll()在类Unix系统中很流行,在C++11中已成为标准,但并不是所有的VC++实现都有它。使用_strtoi64()代替:
__int64 digit = _strtoi64(input, NULL, 10);https://stackoverflow.com/questions/29349076
复制相似问题