2011-07-25 31 views
0

在64位機器麻煩與gmp_xor在32位

(1^2489596804) 

給出-1805370491響應。但是,當我在32位PHP機器上這樣做時,我得到了2489596805的迴應。

所以,我試圖讓它在32位機器上使用gmp_strval(gmp_xor(1,2489596804)),但它也產生2489596805。那麼,怎麼樣才能得到正確的答案?

更新:我剛剛注意到,64位結果是你從它減去32位最大值(4294967295)。

+0

你的意思是64位機器? –

+0

按位運算只能爲無符號整數定義好。對於有符號整數,結果是實現定義的。 –

+0

夠公平的,但我能做些什麼來得到那個結果? – babonk

回答

1

這是同樣的結果,只是有不同的解釋:

0x94643B85 = 2489596805 (unsigned 32-bit integer) 
0x94643B85 = -1805370491 (signed 32-bit integer) 

你看到你的64位計算機上爲負值的原因是,你認爲解釋結果作爲符號的32位整數。

如果你真的想在兩種解釋之間進行轉換,我想你必須自己做。一個簡單的方法可以這樣:

<?php 
function toSigned($value) { 
    if ($value <= 2147483647) 
    return $value; 
    return $value - 4294967295 + 1; 
} 

function toUnsigned($value) { 
    if ($value >= 0) 
    return $value; 
    return $value + 4294967295 - 1; 
}