当我尝试从 double 隐式转换为 unsigned long 时,出现溢出警告:“警告:在隐式常量转换 [-Woverflow] 中溢出”。
这是说明:
unsigned long ulongMax = pow(2.0, 64.0) - 1;
但是当我像下面这样明确地转换它时,没关系!
unsigned long ulongMax = (unsigned long) (pow(2.0, 64.0) - 1);
我不明白为什么我有警告,结果 (18446744073709551615) 与 header “limits.h”中的 ULONG_MAX
相同。
最佳答案
pow(2.0, 64.0)
返回一个 double
。
但是(假设是一个普通的 IEEE754 系统),值 pow(2.0, 64.0)
和 pow(2.0, 64.0) - 1
实际上是相等的。这是因为我们超出了 double
中相邻整数可以精确表示的范围。 (当然,一个64位的double不能代表所有的64位整数)。
现在,从浮点到整数类型的超出范围转换会导致 undefined behaviour ,无需诊断。
您的编译器试图通过在第一种情况下警告您有关此未定义的行为来提供帮助,但是(大概)它将添加的转换视为您说“我不想听到此警告”的消息.
关于c - 隐式转换后溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33948436/