首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当uint64 = uint8 * uint8时溢出

当uint64 = uint8 * uint8时溢出
EN

Stack Overflow用户
提问于 2016-10-14 07:18:28
回答 4查看 161关注 0票数 0

我尝试下面的代码:

代码语言:javascript
复制
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?是对的吗?

我想搜索谷歌的一些提示,但我不知道我应该使用什么关键词。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-10-14 07:25:08

同样的理由

代码语言:javascript
复制
double x=1/2;

会是0,但是

代码语言:javascript
复制
double y=double(1)/2;

将是0.5

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

在这种情况下,一切都是以32位精度计算的,溢出发生在转换到64位之前。

票数 2
EN

Stack Overflow用户

发布于 2016-10-14 07:24:38

代码语言:javascript
复制
UINT a = 32768;
UINT b = 32768;
UINT64 c = a * b * 4;

被评估为

代码语言:javascript
复制
UINT a = (UINT) 32768;
UINT b = (UINT) 32768;
UINT64 c = (UINT) a * (UINT) b * (int) 4;

UINT没有足够的空间存储UINT*UINT时,就会出现溢出。

您可以通过将其中一个UINT转换为UINT64来解决这个问题,如下所示:

代码语言:javascript
复制
UINT64 c = (UINT64) a * b * 4;
票数 3
EN

Stack Overflow用户

发布于 2016-10-14 07:23:03

在c的uint64中,它的右边自动被指定为uint,因为A和B都是uint,然后它将答案分配给c(已经溢出)。为了确保这种情况不会发生,c中的一个变量也必须是uint64,然后它就不会溢出。这就是为什么int64 d工作,因为它也被分配了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40037195

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档