我尝试下面的代码:
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/