【发布时间】:2017-11-03 12:48:04
【问题描述】:
我有一个 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,但出现了同样的现象。
谁能告诉我们这个现象,我们说什么以及如何进一步进行。
【问题讨论】:
-
写错了。问题已更新。 delphi 中的所有变量都是 longint 类型。在 C# 中,所有的都是 int 类型。
-
在 Delphi 中
shr是逻辑移位。在 C# 中,>>是算术移位。你要哪个? en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts -
好吧,显然 C# 和 Delphi 是不同的。选择一个并以不同的方式实施另一个。
-
是的,所有 C#、Delphi-7 和计算器都将其视为负数。但 ShowMessage 将其显示为“1”。
-
C# 文档说明 如果第一个操作数是 int 或 long,则右移是算术移位(高位空位设置为符号位)。 Delphi 文档声明它不保留符号位:docwiki.embarcadero.com/RADStudio/Tokyo/en/Expressions_(Delphi)