2
在32位系统上,阵列可以有多达4294967295个元素(根据另一个线程上的Artefacto's post)。当数组超过2147483647个元素时,count的行为是什么?
然而,count
返回作为INT元件的数目,和一个32位的系统上,一个int是至多2147483647
什么将count
返回时的阵列具有多于2147483647个元素?
在32位系统上,阵列可以有多达4294967295个元素(根据另一个线程上的Artefacto's post)。当数组超过2147483647个元素时,count的行为是什么?
然而,count
返回作为INT元件的数目,和一个32位的系统上,一个int是至多2147483647
什么将count
返回时的阵列具有多于2147483647个元素?
首先,根据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
那你有内存200兆兆字节的计算机? – mario
实际上,即使底层C结构的大小字段可以容纳这么大的值,我也不认为它在32位系统上可能具有很多地址空间不足的元素。 – delnan
@mario,那不是重点。 – Pacerier