【发布时间】:2020-09-04 17:35:38
【问题描述】:
在启用 UBSAN 的情况下编译以下代码会导致此错误:
运行时错误:值 9.22337e+18 超出了可表示的范围 'long long' 类型的值
double a = (double)LLONG_MAX; // or (double)LLONG_MAX - 1
long long b = (long long)a;
这是一个已知问题吗?我的理解是该值不在范围之外。
【问题讨论】:
-
double 存储的确切数字是多少?可能已经超出范围。
-
它没有四舍五入:确切的数字是 9,223,372,036,854,775,807(这不在文档的范围之外)--en.wikibooks.org/wiki/C_Programming/limits.h
-
LLONG_MAX有一个确切的数字十进制值,但随后您将其转换为double可能无法表示该确切数字,因此它会四舍五入。 -
我会看看,谢谢@ChristianGibbons