atoi函数不同平台的实现问题

atoi函数不同平台的实现问题

    工程中要通过文件得到数值,想当然的就使用了atoi这个函数。在
Windows下使用,没什么问题。但是一移植到Linux下,问题就出来了,
发现得到的数总是不对劲。用gdb跟踪一下,发现大于2147483647的数
均返回2147483647这个值。又在Windows下debug了一下,发现得到的数
值正常,能够得到大于2147483647的数。
    这就比较有趣了,2147483647十六进制表示是0x7FFFFFFF。应该是
越界问题。查了一些资料,发现gcc在实现atoi函数的时候,如果输入
的字符串数值大于int型最大值将返回INT_MAX(2147483647)这个值。
    又在Windows下,使用VS.net2003测试了一下,发现数值在2^31~
2^32-1之间,返回正常的数,而大于2^32-1将返回模2^32的数。
    VS.net2003内部实现atoi函数使用了取模操作,以2^32为模。而
gcc使用了截断操作,以2^31-1为界,超过同一返回2^31-1。
    因此,使用atoi函数就需要小心些。而且atol函数跟atoi函数一
样,测试结果一样。
    为了支持得到超过2^31-1的数,在Linux下就必须使用strtoul这
个函数。
    unsigned long strtoul(
       const char *nptr,
       char **endptr,
       int base 
    );
    这个函数功能比atoi强大的多,第一个参数是需要转换的字符串,
第二个参数是扫描结束时指向的位置,从而可以用来获知有没有转换
溢出,第三个参数是进制,支持2~64之间任意一个。这样就可以知道
转换了多少个字符。

PS:
    又用VS.net2005测试过,发现atoi返回的结果已经跟Linux一致了,
即大于INT_MAX时,返回INT_MAX。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值