49字符串转换为整数

本文介绍如何将字符串转换为整数,同时处理边界和溢出情况。在解析过程中,需要考虑字符串的有效性、正负号以及数值是否超出int类型的范围。对于最小负数的边界,可以通过符号位参与运算来避免错误。对于数值越界,可以在每次循环时通过INT_MAX/10判断。最后,结合正负数的标志位和当前数字判断是否越界。
摘要由CSDN通过智能技术生成

题目描述

将一个字符串转换成一个整数,字符串不是一个合法的数值则返回 0,要求不能使用字符串转换整数的库函数。

Iuput:
+2147483647
1a33
Output:
2147483647
0

思路分析

代码逻辑简单,0号位判断是否有+、-符号,其他位判断是否为数字,有字母则返回0。
主要问题在边界判断和输入数据判断上。特别是溢出判断

  • 有效。输入的字符串检测是否有效。常规检验。
  • 正负号。输入的字符串中,正数可以带+号也可以为纯数字。最后返回时需要根据-号判断。
  • 溢出。输出int类型数的边界判断。主要是处理最小负数和判断数值越界溢出。

最小负数

int类型的边界为 -2147483648—2147483647,最大正数的绝对值小于最小负数绝对值。在常规做法中,我们用正数表示结果,最后一步才根据已知将结果取负,所以最终结果会出错。

解决方案

将+,-转为int类型,当符号为+时,标志为1;符号为-时,标志为-1。将符号位参与运算过程中。
eg. value=value10+digit ==> value=value10+isNegtive*digit

数值越界

数值越界即大于2147483647,小于-2147483648。

解决方案

在每次循环时,通过INT_MAX/10的值提前判断是否越界。
eg.

  • 当 value > INT_MAX/10 时,说明扩大10倍后,value 必将越界。
  • 当 value == INT_MAX/10 时,说明扩大10倍后,value 可能越界,也可能不越界,需要利用当前的加数 digit 做进一步的判断:正数是当 digit > 7 时,越界;复数是当 digit > 8 时,越界。
  • 当 value < INT_MAX/10 时,本轮循环必不越界。

正负数越界判断合并

设置正负标记位isNegative,变量overValue记录当前值和INT_MAX/10的差,因为INT_MAX/10为正数,当当前值为负数时,用isNegative转为正数。
overValue = isNegative*value - INT_MAX/10
则overValue>0,越界;overValue<0,不越界;overValue==0时,isNegative=1,digit>7越界;isNegative=-1,digit>8越界。
为方便操作,将-1、1转换为0、1:(isNegative+1)/2+digit > 8时,数值越界。
综上所述,

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值