2013-07-28 18 views
2

在32位系统上,阵列可以有多达4294967295个元素(根据另一个线程上的Artefacto's post)。当数组超过2147483647个元素时,count的行为是什么?

然而,count返回作为INT元件的数目,和一个32位的系统上,一个int是至多2147483647

什么将count返回时的阵列具有多于2147483647个元素?

+1

那你有内存200兆兆字节的计算机? – mario

+0

实际上,即使底层C结构的大小字段可以容纳这么大的值,我也不认为它在32位系统上可能具有很多地址空间不足的元素。 – delnan

+1

@mario,那不是重点。 – Pacerier

回答

7

首先,根据array element的大小,在观察此行为之前,您至少需要163 GiB(32位)或309 GiB(64位)内存。

count()返回值是基于zend_hash_num_elements()

ZEND_API int zend_hash_num_elements(const HashTable *ht)

此返回值,那么被铸造成long之前它返回到您的代码;这导致count()返回一个看似负值。

$c = count($array_with_pow_2_32_elements); 
echo $c; // -2147483648 
printf("%u\n", $c); // 2147483648 

或者:这可以通过迫使它回到一个无符号的价值是固定

$c = sprintf('%u', $c); 
echo $c; // 2147483648 
相关问题