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,但也会出现相同的现象.
任何人都可以讲述这种现象,我们说什么以及如何进一步发展.
在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)
| 归档时间: |
|
| 查看次数: |
217 次 |
| 最近记录: |