考虑以下:
#include <iostream>
#include <cstdint>
int main() {
std::cout << std::hex
<< "0x" << std::strtoull("0xFFFFFFFFFFFFFFFF",0,16) << std::endl
<< "0x" << uint64_t(double(std::strtoull("0xFFFFFFFFFFFFFFFF",0,16))) << std::endl
<< "0x" << uint64_t(double(uint64_t(0xFFFFFFFFFFFFFFFF))) << std::endl;
return 0;
}
哪个打印:
0xffffffffffffffff
0x0
0xffffffffffffffff
第一个数字只是ULLONG_MAX
从字符串转换为 a的结果uint64_t
,它按预期工作。
但是,如果我将结果转换为double
,然后再转换为uint64_t
,那么它会打印0
第二个数字 。
通常,我会将其归因于浮点数的精度不准确,但更让我感到困惑的是,如果我将ULLONG_MAX
fromuint64_t
转换为double
然后返回 to uint64_t
,结果是正确的(第三个数字)。
为什么第二个和第三个结果之间存在差异?
编辑(@Radoslaw Cybulski)对于另一个在这里发生的事情,试试这个代码:
#include <iostream>
#include <cstdint>
using namespace std;
int main() {
uint64_t z1 = std::strtoull("0xFFFFFFFFFFFFFFFF",0,16);
uint64_t z2 = 0xFFFFFFFFFFFFFFFFull;
std::cout << z1 << " " << uint64_t(double(z1)) << "\n";
std::cout << z2 << " " << uint64_t(double(z2)) << "\n";
return 0;
}
愉快地打印:
18446744073709551615 0
18446744073709551615 18446744073709551615