php 中的负 64 位十进制数转二进制

Negative 64bit Decimal Number to Binary in php

我正在尝试转换十进制数

-268427136

二进制,反之亦然。

如果我尝试使用 windows Calc,这个数字的二进制表示法是:

1111111111111111111111111111111111110000000000000010000010000000

如果我尝试 bindec、decbin 或 base_convert: echo(decbin(-268427136)); 输出:

11110000000000000010000010000000

echo(bindec('1111111111111111111111111111111111110000000000000010000010000000');输出:

1.84467440734E+19

我可以在 php 中使用什么来达到相同的结果?

您的 PHP 可能是为 32 位系统编译的,导致整数溢出和数字以 32 位表示。确保您的 PHP 是为 64 位编译的。

你可以用

检查一下
<?php
echo PHP_INT_SIZE;

这应该 return 8。在我的 PHP 上,以下工作是 PHP_INT_SIZE 是 8:

php > echo(decbin(-268427136));
1111111111111111111111111111111111110000000000000010000010000000

背景

PHP在内部使用C语言类型long来表示整数(PHP是用C写的)。这些是平台相关的。在 64 位系统上,通常这些都是 64 位长。在 Windows 上,有时 PHP 等应用程序会编译为 32 位,尽管系统支持 64 位,导致 long32bit4byte。因此你会得到一个 32 位长数字的溢出。在你的情况下:11110000000000000010000010000000

bindec 和 64 位数字

根据 PHP 手册,bindec returns a number. As your number is 64bit, PHP interprets it as a float. It calculates the cutoff for using integer or float without the sign. See 2

php > var_dump(bindec('1111111111111111111111111111111111110000000000000010000010000000'));
float(1.8446744073441E+19)

这可以通过显式转换为 int.

来避免
php > var_dump((int)bindec('1111111111111111111111111111111111110000000000000010000010000000'));
int(-268427264)