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

原创 2006年06月04日 18:08:00

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。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

(HTML控件篇)fieldset和legend标签的属性和使用方法

晚上在随便看一个网页Ajax无刷新聊天室程序的时候,突然看到了fieldset和legend标签,这是我第一次接触和看到这两个HTML标签,感觉很陌生,这或许就是我从弃医从IT的悲剧吧,没怎么完整的学...

atoi函数实现

  • 2013-08-24 21:55
  • 484B
  • 下载

自己实现的atoi函数

  • 2012-03-27 19:47
  • 362KB
  • 下载

atoi和itoa函数及负数转正数时溢出问题

首先贴出c函数库里的atoi函数, 其实是atol函数, 因为atoi调用了atol函数. 函数很简单,相信大家一看就懂. isspace函数是判断传入字符是否为空白符, 空白符指空格, 水平制表,...

动态加载DLL实现不同DLL的相同导出函数调用问题

假设这样的情景:         一个exe加载了两个dll(dll1和dll2,并使用隐式加载)。dll和dll2都同时向外导出一个函数:         int add(int a, ...

C/C++ 实现 atoi 函数

将一段字符串转换为整数数字,最基本的方法就是使用 atoi 函数。如果让我们自己实现一段 atoi 函数,需要注意的细节比较多。原始版本首先想到的就是字符类型之间的差值。可以直接使用字符相减得到差值。...

【练习题】atoi和itoa函数的实现

int atoi (const char * str); //Convert string to integer char * itoa ( int value, char * str, int...

C 标准库 atoi 函数的实现

/* * atoi 是一个解析字符串的一个函数 * 可以将字符串解析为 int 类型 * 解决如下的问题: * 1 空白符 * 2 正号和负号 * 3 进制 * 4 溢出...

尝试实现 atoi和atof函数

手动实现atoi以及atof的功能及思路
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)