PHP中的数字问题(64无符号整数的最大可能值)



这是我正在运行的示例代码。

<?php
//$maxval = (2**64)-1;
$maxval = (2**64);
$maxval = $maxval-10000;

echo number_format($maxval,0,".","") . "n";
echo "18446744073709551615n";


?>

该代码用于检查一个将作为字符串出现的数字,我需要确保它是一个无符号的64位整数。因此,一旦我检查字符串是否仅由数字组成,我需要确保范围是正确的。

但我有一些奇怪的行为。

本线(2**64(-1;印刷18446744073709551616。它似乎忽略了-1。所以我开始将-1更改为-10、-100、-1000,它们都打印出相同的值。当我把它改成-10000时,它才改变了,这就是它打印的内容:

18446744073709541376
18446744073709551615

但据我所知,第一行应该是

18446744073709541615

那么我做错了什么?

PHP中的Integer是一个有符号整数。存在用于最小值和最大值的常量PHP_INT_MIN和PHP_INT_MAX。

//64 Bit PHP Version !
var_dump(PHP_INT_MAX);  //int(9223372036854775807) = 2**63-1

如果值​​如果大于整数范围,PHP会自动转换为浮点。然而,浮点运算的精度远不如63位。这就是不准确的地方。

bcmath函数几乎可以用于任何精度的计算。此代码用于检查将作为字符串出现的数字,该数字是一个无符号64位整数。

$val = "18446744073709551614";
$maxUnsign64Bit ="18446744073709551615";
if(ctype_digit($val) AND bccomp($val,$maxUnsign64Bit) !== 1){
echo 'is a 64 Bit number';
};

最新更新