Delphi 7 对比 C# 表达式求值
Delphi 7 vs C# expression evaluation
我有一个 Delphi-7 表达式如下,所有变量都是 longint-
类型
cy:=((s1 and s2)or((s1 or s2)and not res))shr 31;
在 C# 中,表达式是,所有变量都是 int-
cy = ((s1 & s2) | ((s1 | s2) & (~res)))>>31;
其中
s1 = -659459908
s2 = 283372503
res = 217426595
当 Delphi 7 对它求值时,我通过快速观察向右查看表达式的值,它显示值为 -1,但是当我 ShowMessage(IntToStr(cy))
, 显示1.
而 C# 仍然显示 -1.
我正在研究 Windows-10 64 位系统并从 VS2013 编译任何 CPU 的代码。我也尝试将 C# 变量声明为 Int32,但出现了同样的现象。
有谁能说说这种现象,我们说的是什么以及如何进一步进行。
在 C# >>
中,操作 保留 与 有符号 整数(如 int
、long
(可惜 C# 没有 Java 中的任何 >>>
操作),当 Delphi 的 shr
不会:
在这两种情况下(C# 和 Delphi)我们对内部公式的计算相同
// -79459485 (decimal) == 11010000101000110111000111011100 (binary)
((s1 & s2) | ((s1 | s2) & (~res))) == -794594852
最后一步(-794594852 >> 31
和 -794594852 shr 31
)不同:
11010000101000110111000111011100 >> 31 == 11111111111111111111111111111111 (C#)
11010000101000110111000111011100 >> 31 == 00000000000000000000000000000001 (Delphi)
修改(让C#模仿Delphi):
unchecked {
cy = (int)((uint)((s1 & s2) | ((s1 | s2) & (~res))) >> 31);
}
我有一个 Delphi-7 表达式如下,所有变量都是 longint-
类型cy:=((s1 and s2)or((s1 or s2)and not res))shr 31;
在 C# 中,表达式是,所有变量都是 int-
cy = ((s1 & s2) | ((s1 | s2) & (~res)))>>31;
其中
s1 = -659459908
s2 = 283372503
res = 217426595
当 Delphi 7 对它求值时,我通过快速观察向右查看表达式的值,它显示值为 -1,但是当我 ShowMessage(IntToStr(cy))
, 显示1.
而 C# 仍然显示 -1.
我正在研究 Windows-10 64 位系统并从 VS2013 编译任何 CPU 的代码。我也尝试将 C# 变量声明为 Int32,但出现了同样的现象。
有谁能说说这种现象,我们说的是什么以及如何进一步进行。
在 C# >>
中,操作 保留 与 有符号 整数(如 int
、long
(可惜 C# 没有 Java 中的任何 >>>
操作),当 Delphi 的 shr
不会:
在这两种情况下(C# 和 Delphi)我们对内部公式的计算相同
// -79459485 (decimal) == 11010000101000110111000111011100 (binary)
((s1 & s2) | ((s1 | s2) & (~res))) == -794594852
最后一步(-794594852 >> 31
和 -794594852 shr 31
)不同:
11010000101000110111000111011100 >> 31 == 11111111111111111111111111111111 (C#)
11010000101000110111000111011100 >> 31 == 00000000000000000000000000000001 (Delphi)
修改(让C#模仿Delphi):
unchecked {
cy = (int)((uint)((s1 & s2) | ((s1 | s2) & (~res))) >> 31);
}