gpt4 book ai didi

c# - Bitwise Shift - 在 C#.net 与 PHP 中获得不同的结果

转载 作者:太空宇宙 更新时间:2023-11-03 17:15:51 24 4
gpt4 key购买 nike

当我在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com