C***y 发帖数: 2546 | 1 我的想法是
先转成一个long,然后和INT_MIN和INT_MAX比
最后convert成int输出
不知这个办法是否合适 |
j*****u 发帖数: 1133 | 2 在每次
result = result * 10 + str[i] - '0';
之后check result < 0,如果overflow就会变负
如果C#的话用checked{ } wrap,或者complier打开/checked+,就会自动throw Ov
erflowException()
【在 C***y 的大作中提到】 : 我的想法是 : 先转成一个long,然后和INT_MIN和INT_MAX比 : 最后convert成int输出 : 不知这个办法是否合适
|
C***y 发帖数: 2546 | 3 这个办法不错
谢谢!
【在 j*****u 的大作中提到】 : 在每次 : result = result * 10 + str[i] - '0'; : 之后check result < 0,如果overflow就会变负 : 如果C#的话用checked{ } wrap,或者complier打开/checked+,就会自动throw Ov : erflowException()
|
l*****a 发帖数: 14598 | 4 之前处理也可以,也许更直接
目标 result*10+str[i]-'0'<=MAX_INT
1) result
2) result=MAX_INT/10 && str[i]-'0'<=MAX_INT/10
【在 C***y 的大作中提到】 : 这个办法不错 : 谢谢!
|
C***y 发帖数: 2546 | 5 是不是应该先判断一下 result==INT_MIN
result==INT_MIN的时候虽然<0,但实际上是没有overflow的
【在 j*****u 的大作中提到】 : 在每次 : result = result * 10 + str[i] - '0'; : 之后check result < 0,如果overflow就会变负 : 如果C#的话用checked{ } wrap,或者complier打开/checked+,就会自动throw Ov : erflowException()
|
m******m 发帖数: 19 | 6
str[i]-'0'<=MAX_INT%10 ?
【在 l*****a 的大作中提到】 : 之前处理也可以,也许更直接 : 目标 result*10+str[i]-'0'<=MAX_INT : 1) result: 2) result=MAX_INT/10 && str[i]-'0'<=MAX_INT/10
|
l*****a 发帖数: 14598 | 7 什么问题?
think about last digit of 65534 , 65535 and 65538
【在 m******m 的大作中提到】 : : str[i]-'0'<=MAX_INT%10 ?
|
m******m 发帖数: 19 | 8
我的意思是:不是 str[i]-'0'<=MAX_INT/10,应该是str[i]-'0'<=MAX_INT%10吧
【在 l*****a 的大作中提到】 : 之前处理也可以,也许更直接 : 目标 result*10+str[i]-'0'<=MAX_INT : 1) result: 2) result=MAX_INT/10 && str[i]-'0'<=MAX_INT/10
|
l*****a 发帖数: 14598 | 9 oh,yes
u got it
【在 m******m 的大作中提到】 : : 我的意思是:不是 str[i]-'0'<=MAX_INT/10,应该是str[i]-'0'<=MAX_INT%10吧
|
r****t 发帖数: 10904 | 10 overflow 不一定变负的。
【在 j*****u 的大作中提到】 : 在每次 : result = result * 10 + str[i] - '0'; : 之后check result < 0,如果overflow就会变负 : 如果C#的话用checked{ } wrap,或者complier打开/checked+,就会自动throw Ov : erflowException()
|