unsigned long long
理論的には、10 進数の 19 桁の数である 2^64-1 まで格納する必要があるため、C/C++ 型と混同していますが、次のコード:
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 になります。これは 10 進数 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 ビット システムが必要な場合、gcc は 16 ~ 32 ビット マシンで 1990 年代以降、どのように乱数を生成できますか?
どうもありがとう。