Delphi 7 vs C#表达式评估

Pra*_*kla 1 c# delphi delphi-7

我有一个Delphi-7表达式,如下所示,所有变量都是longint-

cy:=((s1 and s2)or((s1 or s2)and not res))shr 31;
Run Code Online (Sandbox Code Playgroud)

在C#表达式中,所有变量都是int-类型

cy = ((s1 & s2) | ((s1 | s2) & (~res)))>>31;
Run Code Online (Sandbox Code Playgroud)

哪里

s1  = -659459908
s2  =  283372503 
res =  217426595
Run Code Online (Sandbox Code Playgroud)

Delphi 7对它进行评估时,我通过快速观察向右看表达式的值,它将值显示为-1,但是当我ShowMessage(IntToStr(cy))显示为1时.

而C#仍显示-1.

我正在使用Windows-10 64位系统并从VS2013编译任何CPU的代码.我尝试将C#变量声明为Int32,但也会出现相同的现象.

任何人都可以讲述这种现象,我们说什么以及如何进一步发展.

Dmi*_*nko 7

在C#>>操作中,当使用有符号整数进行操作时保留最左边的位(例如,C#没有Java中的任何操作),当Delphi 没有时:intlong>>>shr

在这两种情况下(C#和Delphi),我们对内部公式进行了相同的评估

// -79459485 (decimal) == 11010000101000110111000111011100 (binary) 
((s1 & s2) | ((s1 | s2) & (~res))) == -794594852 
Run Code Online (Sandbox Code Playgroud)

最后一步(-794594852 >> 31-794594852 shr 31)是不同的:

11010000101000110111000111011100 >> 31 == 11111111111111111111111111111111 (C#)
11010000101000110111000111011100 >> 31 == 00000000000000000000000000000001 (Delphi)
Run Code Online (Sandbox Code Playgroud)

修正案(让C#模仿德尔福):

 unchecked { 
   cy = (int)((uint)((s1 & s2) | ((s1 | s2) & (~res))) >> 31);
 }
Run Code Online (Sandbox Code Playgroud)