我正在尝试转换十进制数字,例如
-268427136
到二进制,反之亦然。
如果我尝试使用Windows Calc,这个数字的二进制表示法是:
1111111111111111111111111111111111110000000000000010000010000000
如果我尝试使用bindec,decbin或base_convert:
echo(decbin(-268427136));
输出:
11110000000000000010000010000000
或echo(bindec('1111111111111111111111111111111111110000000000000010000010000000');
输出:
1.84467440734E + 19
我可以在php中使用什么来实现相同的结果?
答案 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位,导致long
为32bit
或4byte
。因此,您会遇到溢出,导致32位长数。在您的情况下:11110000000000000010000010000000
根据PHP手册,bindec返回一个数字。由于您的数字是64位,PHP将其解释为浮点数。它计算使用整数或浮点数而没有符号的截止值。请参阅2。
php > var_dump(bindec('1111111111111111111111111111111111110000000000000010000010000000'));
float(1.8446744073441E+19)
可以通过明确转换为int
来阻止这种情况。
php > var_dump((int)bindec('1111111111111111111111111111111111110000000000000010000010000000'));
int(-268427264)