2010-01-26 157 views
3

我試圖在C中實現George Marsaglia的互補乘法運算法則。它似乎在Win7 64位和Linux 32位下工作良好,但在Win 7 32位下似乎表現得很奇怪。它返回的隨機數是32位,但有內部使用的臨時值應該是64位,它宣稱:類型「long long」總是64位?

unsigned long long t; 

我懷疑這可能是不當行爲的原因,所以我的問題是:

是類型「long long」64位?它在32位Windows中是否受支持?

回答

5

類型long long保證是至少 64位(雖然保證形式上是它必須能夠表示的值範圍的形式)。

以下是在C99 standard (link to draft)的§5.2.4.2.1:

- 最大值爲類型的對象 unsigned long long int

ULLONG_MAX 18446744073709551615 // 2**64 − 1

+0

這是沒有多大用處的大小保證在C99,一個標準* MSVC不執行*。下面是MSDN文檔,它保證Windows在Windows上長整長爲64位:http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx。無論如何,對於C++來說。我不確定MS在哪裏保存其C文檔,但它都是「相同的編譯器」。 – 2010-01-27 02:09:28

+0

因此對於MSVC的情況,這是一個質量實施問題。 OP始終可以檢查「ULLONG_MAX」的值。 – caf 2010-01-27 03:05:45

+0

這不完全是實施問題的質量。 MSVC不執行C99。與GCC不同,AFAIK沒有計劃這麼做,所以它甚至不是「有幾個記錄的故障符合標準」。這是一個C89編譯器,而不是C99編譯器,但它確實有很長的一段延長,與C99一致。缺乏更新的原因是不同的,但你可以說,這是一個質量的實施問題,即使該標準在7月份被批准,但我的無線路由器仍然不支持802.11n .-) – 2010-01-27 03:28:26

7

如果您的編譯器有stdint.h我建議使用uint64_t來代替。

相關問題