【发布时间】:2021-01-03 22:14:00
【问题描述】:
如果我运行以下程序:
#include <iostream>
int main()
{
using namespace std;
uint64_t f12 = 18446744073709551568;
uint64_t f3 = 2;
uint64_t f123 = f12 * f3;
cout << f12 << endl;
cout << f3 << endl;
cout << f123 << endl;
return 0;
}
我得到输出:
18446744073709551568
2
18446744073709551520
我不明白为什么 2 次 f12 会导致值更小(正好是 48)。如果由于达到 uint64 值的大小而导致值翻转,那会不会有很大的不同(除非这是一个极端的巧合)?
【问题讨论】:
-
写
uint64_t f12=-48;,它看起来就不那么令人惊讶了。或打印-f12和-f123。 -
你加倍的值等于 2^64 - 48(使用 ^ 表示幂)在数学上将它加倍产生 2^65 - 96。这大于
uint64_t的范围,所以减去 2^64,得到 2^64 - 96。与原始值的差为 48。
标签: c++ integer precision multiplication