2010-01-26 159 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来代替。

相关问题