【发布时间】:2021-12-07 10:47:32
【问题描述】:
环境:码头工人。 arm64 debian 中的 gcc10。 x86_64 debian 中的 gcc7。
#include <cstdio>
#include <limits>
#include <cstdint>
int main(int args, char *argv[]) {
double d = std::numeric_limits<int64_t>::max();
int64_t t = static_cast<int64_t>(d);
printf("%lld\n", t);
return 0;
}
输出:
- arm64: 9223372036854775807
- x86_64:-9223372036854775808
谁能帮我理解为什么会有差异?
【问题讨论】:
-
您的 int64_t 溢出。疯狂猜测:
std::numeric_limits<int64_t>::max()无法正确表示为 double 并四舍五入到一个整数,转换为int64然后溢出。您应该打印出d包含的内容。 -
当然剩下的一个问题是,为什么行为会有所不同——是在 CPU 之间还是在 GCC 版本之间?只有上帝会告诉你。
-
在 x86-64 上溢出的 FP->int 转换产生“整数不定”值,MSB 设置,所有其他清除。 ARM64 是不同的(可能是饱和的),或者你启用了优化和常量传播删除了实际的运行时转换。
-
stackoverflow.com/q/25857843/1716339 -- 这里部分回答了,因为结果是实现定义的。
标签: c++ x86-64 arm64 floating-point-conversion