【问题标题】:PHP: on 32 bit system INT_MAX displays wrong?PHP:在 32 位系统上 INT_MAX 显示错误?
【发布时间】:2010-09-12 03:52:04
【问题描述】:

我只是想测试一个整数的溢出,例如在 C 中(好吧,如果它刚好超过整数最大值)。当我查看 PHP 是否真的按照我说的做时,它似乎由于某种原因失败了。以下是我对该问题的测试:

define('INT_MAX', 0x7FFFFFFF);
print "In decimal: " . hexdec(INT_MAX) . "<br/>";
print "In decimal: " . hexdec(0x7FFFFFFE) . "<br/>"; //Under int_max
print "In hex: " . dechex(hexdec(INT_MAX)) . "<br/>";
print "Float: " . ((bool)is_float(INT_MAX)?'true':'false') . "<br/>";

结果是:

十进制:142929835591
十进制:142929835590
十六进制:47483647
浮点数:假

正如我在手册上看到的,如果被推翻,它会变成浮动,但它似乎不是,而且显然更高。我是疯了,在这里遗漏了什么,还是在 PHP 中使用十六进制时我真的需要知道一些奇怪的问题?

【问题讨论】:

    标签: php overflow compatibility hex


    【解决方案1】:

    您的程序没有意义,因为您使用的是0x7FFFFFFF,即2147483647,然后将其视为0x2147483647,即十进制的142929835591

    无论如何,PHP 已经有了一个可以使用的常量:

    var_dump(PHP_INT_MAX + 1); // converted to float
    

    【讨论】:

      【解决方案2】:
      define('INT_MAX', 0x7FFFFFFF);
      

      这将INT_MAX 定义为整数2147483647。不必将其解释为十六进制数。如果您真的想将INT_MAX 用作文字十六进制值,则需要将其声明为'7FFFFFFF'(在字符串内);然后hexdec 函数将解释十六进制符号并将其转换为十进制值。

      print(dechex(INT_MAX) . "\n");
      

      这将打印“7fffffff”。

      【讨论】:

      • 我不知道十六进制表示法最后只以十进制存储。我只是错误地将它从十六进制重新转换,谢谢!
      猜你喜欢
      • 2013-05-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-16
      • 1970-01-01
      相关资源
      最近更新 更多