Che*_*esh 4 c++ variables integer memory-management c++17
"x","y" 是 C++ 中的两个 long long 类型变量,我为其分配了两个不同的数字。
变量类型很长很长,但我已经为整数分配了小数。
所以我预计它会修剪小数部分并只显示整数部分。
它修剪掉小数点后的数字并返回一个整数。
输出 :
我期待 x 的 floor() 但它返回了一些以 6 而不是 5 结尾的整数,我的意思是它返回了 ceil(x)。但在第二种情况下它返回了 floor(y)。
它仅在整数太长时发生。
那么这可能是什么原因呢?
我在 Visual Studio 代码上使用 minGW c++17 版本..但在线编译器也发生了同样的情况。
Eri*_*hil 13
每次初始化都涉及两次转换,首先是从源文本中的十进制数字到double,然后是从double到long long。
让我们先讨论第二个声明。因为2.001是double常数,十进制源文本2.001必须转换为double. 假设您的 C 实现使用 IEEE-754 binary64,结果是 2.000999999999999889865875957184471189975738525390625。然后,为了初始化,这个double值被转换为long long。转换为整数类型会丢弃分数,因此结果为 2。
在第一个声明中,当9223372036854775.001转换为 时double,结果是 9223372036854776。这是因为double最接近 9223372036854775.001的两个数字是 9223372036854774 和 9223372036854776,所以选择后者更接近。然后将该double值转换为long long. 没有小数部分,所以结果只是 9223372036854776。
因此,第一次转换向上取整,因为它不是简单地转换为最接近的long long值。它首先必须四舍五入到最接近的double值。而且,在这个数字的范围内,double格式没有足够的分辨率来表示每个整数。它仅表示每隔一个整数:9223372036854770、…772、…774、…776、…778 等等。所以 9223372036854775 不是候选人。