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。

 

阅读更多
个人分类: 程序感悟
上一篇Windows多线程技术研究(四):跨平台线程API
下一篇wav文件格式分析详解
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭