首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

乘法溢出,该怎么解决

2012-10-07 
乘法溢出unsigned int aunsigned int b如何判断a * b溢出?!!!!!!!!![解决办法]a*b 65535[解决办法]我

乘法溢出
unsigned int a;
unsigned int b
如何判断a * b溢出?
!!!!!!!!!

[解决办法]
a*b <= 65535
[解决办法]
我错了 sorry~
[解决办法]
比较b和(2^32-1)/ a的大小
不知有没有更简单的办法~
[解决办法]
a*b <= 4294967295
[解决办法]
#include<iostream>

using namespace std;

int main(void)
{

unsigned int a;
unsigned int b;
unsigned int c;
a= 65536;
b= 65536;
c=a*b;

if (c < 4294967295)
{
cout<<"c: "<<c<<endl;
}
else
{
cout<<"ccc: "<<c<<endl;
}
}
[解决办法]
unsigned longlong aaa = a*b;
if (aaa > 0xffffffff)
{
 // 溢出
}
[解决办法]
你是想事先判断,还是事后判断?

unsigned int最大的数是2^32
[解决办法]
这是个不错的方法

探讨
unsigned longlong aaa = a*b;
if (aaa > 0xffffffff)
{
// 溢出
}

[解决办法]
unsigned int a;
unsigned int b;

unsigned int temp = 0;
for(unsigned int i=0; i<b; i++)
{
if(0xffffffff - temp) > a
{
temp += a;
}
else
{
// 有溢出了
}
}
[解决办法]
事先判断就是在计算乘法之前就知道,那两个数相乘会溢出;事后判断就是两数相乘之后的结果,判断结果是否溢出。
[解决办法]
4楼的想法精简,不过貌似小有bug,下面这样才行:

temp = ((longlong)0xffffffff + b - 1)/b;
if(a>temp)
{
// 有溢出
}
[解决办法]
探讨
这个很好判断。

你只要判断,两个数的最高bit是否同时为1

若是,则必溢出。

若非,则不会溢出。

请用 0xFFFF * 0x7FFF 做一下实验就知道了。

楼主……

[解决办法]
比较b和(2^32-1)/ a的大小 
这种方法实在

热点排行