我與C/C++ unsigned long long
類型混淆,因爲理論上它應該存儲多達19個十進制數字的2^64-1,但以下代碼:unsigned long long將不會存儲大數字
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的數字,低於極限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自20世紀90年代以來如何在16-32位機器上生成隨機數?
非常感謝。
將x改爲long long,它會起作用。 – 2013-03-10 21:30:10