我尝试下面的代码:

UINT a = 32768;
UINT b = 32768;
UINT64 c = a * b * 4;  // c = 0,  overflow...;
UINT64 d = (UINT64)a * (UINT64)b * 4;  // d = 4294967296, the right answer;


为什么UINT64 c = a * b * 4会溢出?

我认为a * b * 4将首先保留一个临时UINT值,然后将其分配给参数c?这样对吗?

我想在Google上搜索一些提示,但是我不知道应该使用哪个关键字。

谢谢

最佳答案

相同的原因

double x=1/2;


将为0,但

double y=double(1)/2;


将为0.5

除非您将一个操作数强制设置为所需的最终类型,否则所有内容都将以任何操作数的最大精度进行计算,并且只有在将其转换为目标类型之后才能进行计算。

在您的情况下,所有内容均以32位精度计算,溢出发生在转换为64位之前。

关于c++ - uint64 = uint8 * uint8时溢出,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40037195/

10-10 13:42