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

标签 c# php vb.net bit-manipulation bitwise-operators

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

相关文章:

c# - 如何从编译的程序集中确定原始 .NET 语言?

c# - Azure Functions 连接监控

c# - 两个相关继承层次结构的OOAD(游戏组件)

c# - 在 ASP.NET Core 3 中使用 id_token

javascript - 使用 Javascript/Bootstrap Checkbox 删除 Laravel 路由

vb.net - .NET Core 不支持 Windows 1252,如何修复?

c# - 什么是NullReferenceException,我该如何解决?

c# - 将相同的属性提取到 WPF XAML 中的样式

php - WordPress 过滤器 - 将 "src"替换为 "load-src"

php - Ajax 多下拉返回值- php mysql