我尝试下面的代码:
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?是对的吗?
我想搜索谷歌的一些提示,但我不知道我应该使用什么关键词。
谢谢
发布于 2016-10-14 07:25:08
同样的理由
double x=1/2;会是0,但是
double y=double(1)/2;将是0.5。
除非强制将一个操作数强制为所需的最终类型,否则所有操作数都将以任何操作数的最大精度计算,并且只有在转换为目标类型之后才能计算。
在这种情况下,一切都是以32位精度计算的,溢出发生在转换到64位之前。
发布于 2016-10-14 07:24:38
UINT a = 32768;
UINT b = 32768;
UINT64 c = a * b * 4;被评估为
UINT a = (UINT) 32768;
UINT b = (UINT) 32768;
UINT64 c = (UINT) a * (UINT) b * (int) 4;当UINT没有足够的空间存储UINT*UINT时,就会出现溢出。
您可以通过将其中一个UINT转换为UINT64来解决这个问题,如下所示:
UINT64 c = (UINT64) a * b * 4;发布于 2016-10-14 07:23:03
在c的uint64中,它的右边自动被指定为uint,因为A和B都是uint,然后它将答案分配给c(已经溢出)。为了确保这种情况不会发生,c中的一个变量也必须是uint64,然后它就不会溢出。这就是为什么int64 d工作,因为它也被分配了。
https://stackoverflow.com/questions/40037195
复制相似问题