我对 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^2 结果为 1,000,000,000,000 - 12 位十进制数字,远低于 even 的限制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 位机器上生成随机数?
太感谢了。