我有一个如下所示的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,但也会出现相同的现象。
任何人都可以讲述这种现象,我们说的是什么以及如何进一步发展。
答案 0 :(得分:7)
在C#>>
操作中保留当使用 signed 整数(例如int
,long
进行操作时最左边的位(唉C#doesn)当Delphi的>>>
不时,不会有 Java 中的任何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#模仿德尔福):
unchecked {
cy = (int)((uint)((s1 & s2) | ((s1 | s2) & (~res))) >> 31);
}