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 位,导致 long
为 32bit
或 4byte
。因此你会得到一个 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)
我正在尝试转换十进制数
-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 位,导致 long
为 32bit
或 4byte
。因此你会得到一个 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)