首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >atoi值的差异

atoi值的差异
EN

Stack Overflow用户
提问于 2015-03-30 14:37:06
回答 7查看 2.9K关注 0票数 2

我有以下代码:

代码语言:javascript
复制
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。

对于第二个例子,为什么输入和数字之间有区别,而它应该是相同的值?

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2015-03-30 14:41:30

atoi仅限于int大小(在最近的平台上为32位)。

如果您想处理大量数字,可以使用atolscanf("%ld")

不要忘记将变量键入到long int (或long)。

您还可以只获取输入的最后一个字符(收集为字符串而不是int)并在其上使用atoi,这样它就不会溢出。

票数 4
EN

Stack Overflow用户

发布于 2015-03-30 14:42:29

可能是因为9999999998比最大(有符号)整数表示要大,所以会有溢出。

实际上,这是9999999998和1410065406的二进制表示:

代码语言:javascript
复制
10  01010100 00001011 11100011 11111110
    01010100 00001011 11100011 11111110

如您所见,如果您看到1410065406是32ed位值9999999998。

票数 6
EN

Stack Overflow用户

发布于 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位longlong long类型。

所以:

代码语言:javascript
复制
long long digit = strtoll(input, NULL, 10);

注意:strtoll()在类Unix系统中很流行,在C++11中已成为标准,但并不是所有的VC++实现都有它。使用_strtoi64()代替:

代码语言:javascript
复制
__int64 digit = _strtoi64(input, NULL, 10);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29349076

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档