2010-09-12 152 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 
相關問題