Redian新闻
>
大牛,过来讨论一下这道题
avatar
大牛,过来讨论一下这道题# JobHunting - 待字闺中
a*r
1
这是原话:
int multiply(int a, int b)
{
return axb;
}
Is it sufficient?
我说要防止overflow, 可以改成
return (axb)%INT_MAX
他说不对,如果product大于INT_MAX呢?又问如何检查overflow
avatar
h*e
2
!b ? 0 : (INT_MAX + (a > 0 ^ b > 0)? 1: 0) /abs(b) >= abs(a) ? a* b : a > 0^
b> 0 ?INT_MIN: INT_MAX
avatar
A*i
3
用INT_MAX/a,结果比b小的肯定会溢出,就不用算了
avatar
A*0
4
是否是Integer.MAX_VALUE/a跟b比?

【在 a********r 的大作中提到】
: 这是原话:
: int multiply(int a, int b)
: {
: return axb;
: }
: Is it sufficient?
: 我说要防止overflow, 可以改成
: return (axb)%INT_MAX
: 他说不对,如果product大于INT_MAX呢?又问如何检查overflow

avatar
b*g
5
菜鸟一个,我觉得检查int乘法overflow最直接的方法就是先把两数转换成正的,然后
中间结果转换成unsigned long long,这样可以保证乘的过程不会溢出,最后再判断这
个中间结果m>INTMAX 或者-m
avatar
Q*F
6
int multiply(int a, int b)
{
if(a==0 || b==0) return 0;
bool neg = (a>0 && b<0) || (a<0 || b>0);
return neg? ((INT_MIN/a >b) ? INT_MIN : a*b) : ((INT_MAX/a < b) ? INT_
MAX : a*b);
}
avatar
b*g
7
得考虑正负号吧?
比如a = INT_MIN, b = -1:
INT_MAX/a = INT_MAX/INT_MIN >= b,但a*b = -INT_MIN溢出了

【在 A*****i 的大作中提到】
: 用INT_MAX/a,结果比b小的肯定会溢出,就不用算了
avatar
M*a
8
估计就是乘法改成加法来做
比如5*7 = 5<<2 + 5<<1 + 5<<0
每次<
相关阅读
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。