我对 C/C++ 中的 unsigned long long
类型感到困惑,因为理论上它应该存储高达 2^64-1 的数字,即 19 个十进制数字,但下面的代码:
unsigned int x = 1000000u; //(One million)
unsigned long long k = (x*x);
cout << k << endl;
输出结果为3567587328,这是不正确的。现在,1,000,000的平方结果为1,000,000,000,000,是一个12位小数的数字,远远低于甚至signed long long
的限制。这是怎么发生的呢?是否与我运行的系统有关?(32位Ubuntu)
如果我需要一个64位系统来执行64位操作,那么另一个问题就出现了:大多数编译器使用线性同余生成器来生成随机数,如下所示:
x(t) = (a*x(t-1) + c) mod m.
a
和c
通常是32位大数,m是2^32-1
。因此,在模运算执行之前,a*x(t-1)
很可能会产生一个64位数字。
如果需要一个64位系统,那么自1990年以来,gcc如何在16-32位的机器上生成随机数?
非常感谢。