【问题标题】:PHP var becoming negativePHP var变为负数
【发布时间】:2011-02-17 14:26:56
【问题描述】:

我有这个代码:

<?php
$integer = 33963677451;
$integer &= 0xFFFFFFFF;
echo $integer;
?>

但是,当我执行它时,输出是

-396060917

Python 中的相同函数

if __name__ == '__main__':
    integer = 33963677451
    integer &= 0xFFFFFFFF
    print integer

输出是

3898906379

似乎 PHP 不能存储大变量。你们知道如何在 PHP 中获得与 Python 中相同的结果吗?

谢谢!

【问题讨论】:

  • 不是 Python 中的同一个函数! 0F FF FF FF FF FF != FF FF FF FF
  • 在 Python 3 中不会发生,如果您使用 long (33963677451L),也不会在 Python 2 中发生。 (适用于 4 和 6 字节操作数。)
  • 虽然两个数字不同,但问题的本质是一样的:php不支持开箱即用的无符号整数
  • @Foo:Python 也没有。但是,Python 有 bigints 并使用它们来避免溢出。

标签: php python integer


【解决方案1】:

该值对于整数来说太大了,python 动态地将其转换为 long 变量。 INT_MAX 定义了整数在转换为双精度之前可以有多大。如果您想在没有怪癖的情况下处理大量数字,请使用 GMPLIB 多精度算术库。

【讨论】:

    【解决方案2】:

    您的33,963,677,451 高于有符号 32 位整数支持的值(最大 2,147,483,647)。 64 位 PHP 版本确实支持更高的值。

    【讨论】:

      【解决方案3】:

      php 只支持有符号整数。你看到溢出了

      另外,python 案例的答案应该是33963677451

      【讨论】:

        【解决方案4】:

        我不知道这是否只是一个错字,但在每种语言中执行 AND 操作时,您使用了不同的值。 :)

        您的 PHP 版本中有“0xFFFFFFFFFFF”(11 个字符),而 Python 版本中只有 8 个字符。

        不管怎样,应该是整数溢出。

        【讨论】:

        • 哎呀,你是对的,它应该是 8 个字符 :) 感谢您的注意
        【解决方案5】:
        <?php
        $integer = (float) 33963677451;
        $integer &= 0xFFFFFFFFFFF;
        echo $integer;
        

        尝试确保 $integer 是浮点类型。

        了解更多:http://www.php.net/manual/de/language.types.integer.php#language.types.integer.overflow

        【讨论】:

        • 是的,我猜你有 32 位 :) 你可能还想看看stackoverflow.com/questions/211345/…
        • 我使用的是 64 位系统...但 WAMP 可能不支持此功能。在我的网络服务器上,它运行良好:) !
        【解决方案6】:

        如果你想看看发生了什么,这里有一个显示不同类型的 printf 语句。

        $i1 = 33963677451;
        $i2 = 0xFFFFFFFFFFF;
        printf("%b (%d, %f) & \n%b (%d, %f)\n = \n%b (%d, %f)", 
                $i1, $i1, $i1, $i2, $i2, $i2, $i1&$i2, $i1&$i2, $i1&$i2);
        

        PHP 将大于 32 位的整数转换为浮点数。好像不能对浮点数执行这个操作。

        【讨论】:

          猜你喜欢
          • 2021-11-23
          • 2012-01-08
          • 2011-08-08
          • 2019-09-20
          • 1970-01-01
          • 2016-04-11
          • 1970-01-01
          • 2017-10-22
          • 2022-01-22
          相关资源
          最近更新 更多