2010-09-12 139 views
1

我只是希望测试一个整数溢出,比如在C中(好吧,如果它总是超过整数max)。当我查看PHP是否确实在按照我的要求进行操作时,由于某种原因它似乎失败了。这里是我的问题的测试:PHP:在32位系统上INT_MAX显示错误?

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中使用十六进制时的情况?

回答

1
define('INT_MAX', 0x7FFFFFFF); 

这定义INT_MAX是整数2147483647。没有必要将其解释为十六进制数字。如果你真的想使用INT_MAX作为文字十六进制值,那么你需要声明它为'7FFFFFFF'(在一个字符串内);那么hexdec函数将解释十六进制符号并将其转换为十进制值。

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

这会打印“7fffffff”。

+0

我不知道该十六进制表示只存储它在小数到底。我只是错误地从十六进制恢复它,谢谢! – John 2010-09-15 22:54:57

5

你的程序是没有意义的,因为你正在服用0x7FFFFFFF这是2147483647,然后再处理它像0x2147483647,这是十进制142929835591

无论如何,PHP已经有一个恒定的,您可以使用:

var_dump(PHP_INT_MAX + 1); // converted to float 
相关问题