按位移位 - 在C#.net与PHP中获得不同的结果

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代码中存在位截断的问题.我不确定它是否有意.