PHP:在32位系统上INT_MAX显示错误?

时间:2010-09-12 03:52:04

标签: php overflow compatibility hex

我只是希望测试整数上的溢出,例如在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中使用十六进制时我真的需要知道一些奇怪的问题吗?

2 个答案:

答案 0 :(得分:5)

您的计划毫无意义,因为您正在使用0x7FFFFFFF 2147483647,然后将其视为0x2147483647,即十进制142929835591

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

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

答案 1 :(得分:1)

define('INT_MAX', 0x7FFFFFFF);

这将INT_MAX定义为整数2147483647。没有必要将其解释为十六进制数。如果您确实希望将INT_MAX用作文字十六进制值,则需要将其声明为'7FFFFFFF'(在字符串内);然后hexdec函数将解释十六进制表示法并将其转换为十进制值。

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

这会打印“7fffffff”。