【问题标题】:Delphi 7 vs C# expression evaluationDelphi 7 vs C# 表达式评估
【发布时间】: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)

标签: c# delphi delphi-7


【解决方案1】:

在 C# >> 操作中保留当使用 有符号 整数如 intlong 操作时最左边的位(唉 C# 没有任何 @987654324 @ 操作如 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);
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-26
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多