我正在将一个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代码结果的负数。我能做些什么来实现这个目标?
答案 0 :(得分:3)
C#long
数据类型是64位长有符号整数。 VB6 long
数据类型是32位有符号整数。因此在VB6中,您获得了操作集的符号位,而在C#中则未设置。
在C#中使用32位整数类型(int
/ Int32
)。
答案 1 :(得分:2)
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
。
答案 2 :(得分:0)
只要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;