当我在 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 中是否有解决此问题的方法?
最佳答案
严格来说,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)
当你说:
The interesting thing is, that when I try to shift any number greater then int32 in .net it yields bad results..
它会给你带来不好的结果,因为为了适应 32 位,一些位被切掉了。
如果您要从 PHP 移植到 C# 并需要保留此行为,则需要使用 2269495617392648 & 0xffffffff
而不是仅使用 2269495617392648
手动截断这些位(见 jcomeau_ictx's answer )。但请注意,您的 PHP 代码中存在位截断问题。我不确定这是不是故意的。
关于c# - Bitwise Shift - 在 C#.net 与 PHP 中获得不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6006574/