Hen*_*nry 1 php c# vb.net bit-manipulation bitwise-operators
当我在PHP中运行此命令时,我得到:
Code: 2269495617392648 >> 24
Result: 32
Run Code Online (Sandbox Code Playgroud)
当我在C#.net或vb.net中运行它时,我得到:
Code: 2269495617392648 >> 24
Result: 135272480
Run Code Online (Sandbox Code Playgroud)
PHP是正确的.
有趣的是,当我尝试移动任何大于int32.net的数字时,会产生不良结果.
每个数字都会int32 (2147483647)产生与php和c#.net或vb.net相同的结果
在.net中有解决方法吗?
In *_*ico 12
严格来说,PHP是错误的.
该数字的整个位模式2269495617392648是:
1000 0001 0000 0001 1000 0010 0000 0001 1000 0001 0000 0000 1000 (2269495617392648)
Run Code Online (Sandbox Code Playgroud)
右移24次让你:
0000 0000 0000 0000 0000 0000 1000 0001 0000 0001 1000 0010 0000 (135272480)
Run Code Online (Sandbox Code Playgroud)
这是比特模式135272480,而不是32.
PHP中发生的事情显然是通过只保存低32位2269495617392648来截断数字538447880.请注意,该数字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)
Run Code Online (Sandbox Code Playgroud)
当你说:你曾提到过这个问题:
有趣的是,当我尝试在.net中移动任何数字大于int32时,会产生错误的结果.
它会给你带来不好的结果,因为有些位被切断以适应32位.
如果您要从PHP移植到C#并且需要保留此行为,则需要使用2269495617392648 & 0xffffffff而不是仅仅手动截断位2269495617392648(请参阅jcomeau_ictx的答案).但请注意,PHP代码中存在位截断的问题.我不确定它是否有意.
| 归档时间: |
|
| 查看次数: |
565 次 |
| 最近记录: |