C库函数atoi的实现和一些讨论
2009-08-26 14:22
218 查看
函数原型:int atoi(const char* str)
函数功能:将字符串转换为对应的整数值
基本步骤:
1)处理空白字符;
2)处理符号字符;
3)处理数值字符;
4)返回结果。
函数实现:
函数看上去没有什么问题,实际上也的确没什么问题。
但
是有的人可能会有疑问了,认为函数可能有个小小的bug。大家都知道,对于一个32位系统,int的典型范围为-2^31~2^31-1,那对于最小的这
个负数-2^31,其字符串为“-2147483648”,由于上面的函数实现在处理上将符号与数值分开来,这就造成了result的值必然会溢出,即
int类型并不能表示最小负数的绝对值2147483648。
但是幸运的是2147483648被int类型解释为-2147483648,二者的二进制补码编码都为1000 0000 0000 0000
0000 0000 0000 0000,这样result再乘以-1(二进制补码编码为1111 1111 1111 1111 1111 1111
1111 1111),截断后result的结果依然为1000 0000 0000 0000 0000 0000 0000
0000。
所以,对于最小的整数上面这个atoi的实现的结果是多少呢?答案为-2147483648,结果正确。
其实程序在运算的过程中并不会管数据的类型是什么,系统只是将数据编码为二进制进行运算,再将运算的结果用类型来解释。我想这也就是为什么大家
在glibc的源码中类似函数也没有看到关于越界处理内容的原因吧。
我们不得不感叹前人设计二进制反码表示法的精妙。
函数功能:将字符串转换为对应的整数值
基本步骤:
1)处理空白字符;
2)处理符号字符;
3)处理数值字符;
4)返回结果。
函数实现:
]#include <stdio.h> #include <assert.h> static int atoi(const char* str) { int result = 0; int sign = 0; assert(str != NULL); // proc whitespace characters while (*str==' ' || *str=='/t' || *str=='/n') ++str; // proc sign character if (*str=='-') { sign = 1; ++str; } else if (*str=='+') { ++str; } // proc numbers while (*str>='0' && *str<='9') { result = result*10 + *str - '0'; ++str; } // return result if (sign) result *= -1; return result; }
函数看上去没有什么问题,实际上也的确没什么问题。
但
是有的人可能会有疑问了,认为函数可能有个小小的bug。大家都知道,对于一个32位系统,int的典型范围为-2^31~2^31-1,那对于最小的这
个负数-2^31,其字符串为“-2147483648”,由于上面的函数实现在处理上将符号与数值分开来,这就造成了result的值必然会溢出,即
int类型并不能表示最小负数的绝对值2147483648。
但是幸运的是2147483648被int类型解释为-2147483648,二者的二进制补码编码都为1000 0000 0000 0000
0000 0000 0000 0000,这样result再乘以-1(二进制补码编码为1111 1111 1111 1111 1111 1111
1111 1111),截断后result的结果依然为1000 0000 0000 0000 0000 0000 0000
0000。
所以,对于最小的整数上面这个atoi的实现的结果是多少呢?答案为-2147483648,结果正确。
其实程序在运算的过程中并不会管数据的类型是什么,系统只是将数据编码为二进制进行运算,再将运算的结果用类型来解释。我想这也就是为什么大家
在glibc的源码中类似函数也没有看到关于越界处理内容的原因吧。
我们不得不感叹前人设计二进制反码表示法的精妙。
相关文章推荐
- 关于单例模式的一些讨论(实现单例模式)
- 最近关于XBRL 业务规则处理器Business Rules Processors的讨论很热闹,也罗列了一些实现Formula的工具
- 关于 mldonkey 的一些讨论和设置
- 4.8、一些杂散但值得讨论的问题
- 按"利用C++语言设计可扩展线程池"文章实现代码,但是有问题,希望大家来讨论,指出问题,谢谢
- 动态字符串结构的一些算法实现
- VB.NET Winform的一些功能实现
- 有关网站UI实现的几种方式的讨论
- 一些前台功能代码实现
- 一些算法题的实现
- Android面面观——Android事件处理下(按键、触摸屏和滚动球的一些实现细节)
- Android 上成功实现了蓝牙的一些Profile
- 回溯算法的一些案例分析(c代码实现)
- mybatis一些实现总结
- C#+Mapxtreme 实现一些GIS系统基本的功能
- H面试程序(0):字符串一些常用函数的实现
- 推荐+1置顶+1(分享、讨论、实现)通用软件注册功能之建立有效的软件保护机制
- 一些数据结构的实现
- 原创:大数阶乘的讨论(4) (源码未实现)
- 一些具有较强的可扩展性app的实现方法概述