【问题标题】:Negative 64bit Decimal Number to Binary in php在php中将负64位十进制数转换为二进制
【发布时间】:2016-09-26 09:50:25
【问题描述】:

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

-268427136

二进制,反之亦然。

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

111111111111111111111111111111111110000000000000010000010000000

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

11110000000000000010000010000000

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

1.84467440734E+19

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

【问题讨论】:

    标签: php binary base-conversion


    【解决方案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 上,尽管系统支持 64 位,但有时诸如 PHP 之类的应用程序被编译为 32 位,导致long 成为32bit4byte。因此你会得到一个溢出,导致一个 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)
    

    【讨论】:

    • 部分正确。我刚刚切换到使用 PHP_INT_SIZE 8 的 x64 php,其中 php &gt; echo(decbin(-268427136)); 1111111111111111111111111111111111110000000000000010000010000000 是正确的,但 echo (bindec('1111111111111111111111111111111111110000000000000010000010000000')); 输出 1.8446744073441E+19
    • bindec 返回一个数字,也可以是浮点数。在您的情况下,它将其解释为浮点数而不是带符号的 64 位整数。试试:var_dump((int)bindec('1111111111111111111111111111111111110000000000000010000010000000'))
    猜你喜欢
    • 1970-01-01
    • 2017-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多