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