2011-05-15 76 views
1

當我運行PHP中的這個命令,我得到:按位移位 - 獲取不同的結果在C#.NET與PHP

Code: 2269495617392648 >> 24 
Result: 32 

當我在C#.NET或vb.net運行它,我得到:

Code: 2269495617392648 >> 24 
Result: 135272480 

PHP是正確的。

有趣的是,當我試圖轉移任何數量比.NET int32更大,它產生壞的結果..

int32 (2147483647)下每一個數字產生的PHP和C#.NET或VB相同的結果.net

在.net中是否有解決此問題的方法?

+0

自從我上次使用C#以來已經有一段時間了,但我相信你的問題可能與PHP沒有強類型並且它在運行時推導出你的變量類型有關,所以它會給你一個很大的變量類型,如果你需要。我想你的C#中的變量正在被溢出,所以也許使用更大的類型將有所幫助。在C#中是否有int64類型?無論是或長或長。 – 2011-05-15 04:58:04

回答

12

嚴格來說,PHP是錯誤的。

數量2269495617392648的整個位模式是:

1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648) 

,右移這24次讓你:

0000 0000 0000 0000 0000 0000 1000 0001 0000 0001 1000 0010 0000 (135272480) 

這是135272480,不32位模式。

PHP中發生了什麼很明顯,2269495617392648被截斷爲538447880只保留了較低的32位。請注意,數字2269495617392648太大而不適合32位整數,有符號或無符號。

右移截取位24次,給我們32

Before truncation to 32-bits: 
1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648) 

After truncation to 32-bits: 
0010 0000 0001 1000 0001 0000 0000 1000 (538447880) 

Right shifting the truncated bits by 24 bits: 
0000 0000 0000 0000 0000 0000 0010 0000 (32) 

你時你說都提到了這個問題:

有趣的是,當我 嘗試在.NET轉移任意數量大於 INT32它產生不好的結果..

它會給你帶來不好的結果,因爲有些位被切斷以適應32位。

如果你從PHP移植到C#和需要保留這種行爲,你需要使用2269495617392648 & 0xffffffff,而不是僅僅2269495617392648(見jcomeau_ictx's answer)手動截斷位。但請注意,PHP代碼中存在位截斷的問題。我不確定它是否有意或無意。

3

按位與你的號碼在移位前用0xffffffff。

在Python:


>>> 2269495617392648 >> 24 
135272480L 
>>> (2269495617392648 & 0xffffffff) >> 24 
32L 

我很少使用.NET,但相當肯定的語法會很相似。