加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

隐式转换后溢出

发布时间:2020-12-16 10:00:18 所属栏目:百科 来源:网络整理
导读:当我尝试从double到无符号long进行隐式转换时,我有一个溢出警告:“警告:隐式常量转换溢出[-Woverflow]”. 这是指令: unsigned long ulongMax = pow(2.0,64.0) - 1; 但是当我明确表达如下所示时,它没关系! unsigned long ulongMax = (unsigned long) (pow
当我尝试从double到无符号long进行隐式转换时,我有一个溢出警告:“警告:隐式常量转换溢出[-Woverflow]”.

这是指令:

unsigned long ulongMax = pow(2.0,64.0) - 1;

但是当我明确表达如下所示时,它没关系!

unsigned long ulongMax = (unsigned long) (pow(2.0,64.0) - 1);

我不明白为什么我有一个警告,结果(18446744073709551615)与标题“limits.h”中的ULONG_MAX相同.

解决方法

pow(2.0,64.0)返回一个double.

然而(假设正常的IEEE754系统),值pow(2.0,64.0)和pow(2.0,64.0)-1实际上是相等的.这是因为我们超出了相邻整数在双精度中完全具有代表性的范围. (当然,64位双精度不能代表所有64位整数).

现在,从浮点到整数类型的超出范围转换导致undefined behaviour,无需诊断.

您的编译器在第一种情况下通过警告您有关此未定义的行为来尝试提供帮助,但(可能)它会将添加的演员视为来自您的消息“我不想听到此警告”.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读