2011-02-17 57 views
2

我有這樣的代碼:PHP變種成爲負

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

但是,當我執行它,輸出

-396060917 

在Python

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

輸出功能相同是

3898906379 

看來PHP不能存儲大的變量。你們有沒有想法如何在Python中獲得相同的結果?

謝謝!

+4

那就是不是Python中的相同功能! `0F FF FF FF FF FF!= FF FF FF FF` – KingCrunch 2011-02-17 14:30:37

+1

在Python 3中不會發生,如果使用long(`33963677451L`),則不會在Python 2中發生。 (適用於4和6字節操作數。) – delnan 2011-02-17 14:31:44

+0

即使這兩個數字不同,問題的實質也是一樣的:php不支持開箱即用的無符號整數 – 2011-02-17 14:35:02

回答

4

該值對於整數來說太大,python會動態地將其轉換爲長變量。 INT_MAX定義了整數在切換到double之前的大小。如果你想操縱大數而不怪怪的話可以使用多精度算術庫。

0

php只支持有符號整數。您所看到的溢出

此外,對於蟒蛇情況下,答案應該是33963677451

+0

請參閱http://php.net/manual/en/language.types.integer.php – 2011-02-17 14:34:27

1

33,963,677,451高於多麼簽署32位整數支持(最多2,147,483,647)。 64位PHP版本確實支持更高的值。

0

我不知道它是否只是一個拼寫錯誤,但是您在使用每種語言執行AND操作時使用的是不同的值。 :)

您的PHP版本中有「0xFFFFFFFFFFF」(11個字符),而Python版本只有8個。

無論哪種方式,它應該是整數溢出。

0

如果你想看到發生了什麼,這裏是展示不同類型的一個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位的整數轉換爲浮點數。看來你不能在浮動上執行這個操作。