php

时间:2016-09-26 09:50:25

标签: php binary base-conversion

我正在尝试转换十进制数字,例如

  

-268427136

到二进制,反之亦然。

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

  

1111111111111111111111111111111111110000000000000010000010000000

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

  

11110000000000000010000010000000

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

  

1.84467440734E + 19

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

1 个答案:

答案 0 :(得分:1)

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

您可以使用

进行检查
<?php
echo PHP_INT_SIZE;

这应该返回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返回一个数字。由于您的数字是64位,PHP将其解释为浮点数。它计算使用整数或浮点数而没有符号的截止值。请参阅2

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

可以通过明确转换为int来阻止这种情况。

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