C库函数atoi的实现和一些讨论

函数原型: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的源码中类似函数也没有看到关于越界处理内容的原因吧。

我们不得不感叹前人设计二进制反码表示法的精妙。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值