c - 隐式转换后溢出

标签 c casting double integer-overflow

当我尝试从 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/

相关文章:

c# - 为什么没有M后缀的c#小数不能初始化?

c++ - 将链接切割树的 C++ 实现转换为 C

c++ - `std::string(strerror(errno))` 危险吗?

java - 为什么这段代码显示异常?

java - 如何在java中翻译C语言的casting?

c++ - const_cast 安全吗?

c# - 在数学回合中使用 'double' 中的逗号

c - 在 SDL 中使用 gimp 导出的 .c/.h 图像

用于将一串十六进制数字转换为整数的 C 库函数?

java - 在java中解析字符串数组