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

本文关键字:结果 net PHP | 更新日期: 2023-09-27 17:56:23

当我在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 中是否有解决方法?

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

严格来说,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 中发生的事情显然是,通过仅保留较低的 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)

当你说时,你已经提到了这个问题:

有趣的是,当我 尝试将任何数字移得更大 int32 在 .net 中会产生不好的结果。

它给你不好的结果,因为一些位被砍掉以适合 32 位。

如果要从 PHP 移植到 C# 并需要保留此行为,则需要使用 2269495617392648 & 0xffffffff 而不是仅2269495617392648来手动截断位(请参阅 jcomeau_ictx 的答案)。但请注意,PHP 代码中存在位截断的问题。我不确定这是有意还是无意。

按位和移位前0xffffffff的数字。

在 Python 中:


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

我很少使用 .net,但可以肯定语法会非常相似。