我試圖在C中實現George Marsaglia的互補乘法運算法則。它似乎在Win7 64位和Linux 32位下工作良好,但在Win 7 32位下似乎表現得很奇怪。它返回的隨機數是32位,但有內部使用的臨時值應該是64位,它宣稱:類型「long long」總是64位?
unsigned long long t;
我懷疑這可能是不當行爲的原因,所以我的問題是:
是類型「long long」64位?它在32位Windows中是否受支持?
我試圖在C中實現George Marsaglia的互補乘法運算法則。它似乎在Win7 64位和Linux 32位下工作良好,但在Win 7 32位下似乎表現得很奇怪。它返回的隨機數是32位,但有內部使用的臨時值應該是64位,它宣稱:類型「long long」總是64位?
unsigned long long t;
我懷疑這可能是不當行爲的原因,所以我的問題是:
是類型「long long」64位?它在32位Windows中是否受支持?
類型long long
保證是至少 64位(雖然保證形式上是它必須能夠表示的值範圍的形式)。
以下是在C99 standard (link to draft)的§5.2.4.2.1:
- 最大值爲類型的對象
unsigned long long int
ULLONG_MAX 18446744073709551615 // 2**64 − 1
如果您的編譯器有stdint.h
我建議使用uint64_t
來代替。
這是沒有多大用處的大小保證在C99,一個標準* MSVC不執行*。下面是MSDN文檔,它保證Windows在Windows上長整長爲64位:http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx。無論如何,對於C++來說。我不確定MS在哪裏保存其C文檔,但它都是「相同的編譯器」。 – 2010-01-27 02:09:28
因此對於MSVC的情況,這是一個質量實施問題。 OP始終可以檢查「ULLONG_MAX」的值。 – caf 2010-01-27 03:05:45
這不完全是實施問題的質量。 MSVC不執行C99。與GCC不同,AFAIK沒有計劃這麼做,所以它甚至不是「有幾個記錄的故障符合標準」。這是一個C89編譯器,而不是C99編譯器,但它確實有很長的一段延長,與C99一致。缺乏更新的原因是不同的,但你可以說,這是一個質量的實施問題,即使該標準在7月份被批准,但我的無線路由器仍然不支持802.11n .-) – 2010-01-27 03:28:26