PHP:为什么dechex即使数字很小也会失败


PHP: why would dechex fail even with small number?

我在使用bindec和dechex函数将二进制字符串转换为十六进制字符串时遇到问题。在我的研究中,我发现无论是一般的PHP还是特定的dechex都有319259235818的整数大小限制。然而,我的代码失败了,即使我的应用程序中可能的最大整数比小一个数量级

$bin = "11111111111111111111111111111111111";
var_dump($bin); //'11111111111111111111111111111111111' (length=35)
$dec = bindec($bin);
var_dump($dec); // float 34359738367
$hex = dechex($dec);
var_dump($hex); // 'ffffffff' (length=8) (binaryhexconverter.com shows 7FFFFFFFF (length 9) as the result)
$dec2 = hexdec($hex);
var_dump($dec2); //float 4294967295
$bin2 = decbin(hexdec($hex));
var_dump($bin2); //'11111111111111111111111111111111' (length=32)

发生了什么事?

文档中有明确说明

可以转换的最大数字是PHP_INT_MAX * 2 + 1(或-1) :在32位平台上,这将是十进制的4294967295,导致CCD_ 3返回CCD_。

很明显,您使用的是32位平台,因为bindec()生成了float,而不是integer

该函数可以转换过大的数字,使其不适合平台整数类型,较大的值以浮点形式返回案例

问题是,虽然bindec确实"足够聪明",可以进行这样的转换,但dechex不会这样做——它只适用于integer值。