vb6 与 c# 中的异或 (XOR)

Exclusive OR (XOR) in vb6 versus c#

我正在将一个 vb6 程序转换为 c#,但我不明白为什么我的异或操作的结果会给我不同的值。

vb6代码:

'serialNum = 884167284, and dSize = 1953312760 here'
serialNum = serialNum Xor dSize       'serialNum = 1088322956 after this operation'
serialNum = serialNum Xor &HD7BF3A9C  'serialNum = -1755232496 after this operation'
GetDriveSerialNum = serialNum

C#代码:

//serialNum = 884167284, and dSize = 1953312760 here
serialNum = serialNum ^ dSize;       //serialNum = 1088322956 after this operation
serialNum = serialNum ^ 0xD7BF3A9C;  //serialNum = 2539734800 after this operation
return serialNum;

我需要 c# 代码给出负数,即 vb6 代码的结果。我该怎么做才能实现这一目标?

vb6中的long是一个32位有符号值,所以它的范围是-2,147,483,468到2,147,483,468。

C#中的long是一个64位有符号值,所以它的取值范围是–9,223,372,036,854,775,808到9,223,372,036,854,775,807。

在 vb6 XOR 中你溢出了,这就是为什么数字是负数。要获得相同的值,您可以在 C# 中使用 int

C# long 数据类型是 64 位长有符号整数。 VB6 long 数据类型是 32 位有符号整数。因此,在 VB6 中,您将获得操作集的符号位,而在 C# 中,它是未设置的。

改用 C# 中的 32 位整数类型 (int / Int32)。

只要 VB6 中的 long 数据类型是 32 位有符号整数,而在 C# 中它是 64 位有符号整数,您就需要在 C# 中使用 uint 数据类型。

        uint serialNum = 884167284;
        uint dSize = 1953312760;

        serialNum = serialNum ^ dSize;
        serialNum = serialNum ^ 0xD7BF3A9C;

        //Your signed representation -1755232496.
        int serialNumSigned = (int)serialNum;