我正在将旧的VB6代码(从远程设备下载已保存的数据)转换为C#。 我已经对其进行了很多转换,但是这些常量似乎有问题。
VB6代码:
Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000
C#代码:
private const int GENERIC_WRITE = 0x40000000;
private const uint GENERIC_READ = 0x80000000;
为什么第二行必须是单位? 如果我将其作为int进行操作,会给我一个错误吗?
答案 0 :(得分:2)
Int32的最大值为2,147,483,647,0x80000000的值为2,147,483,648,即Int32.MaxValue + 1
。
使用uint
(或long
)可以为您提供足以容纳您要分配的值的类型。
答案 1 :(得分:1)
正确的C#翻译是:
const int GENERIC_READ = unchecked((int)0x80000000);
在VB中,'GENERIC_READ'隐式为带有负值的整数。在C#中重现此错误的唯一方法是在未检查的上下文中将无符号整数文字转换为int。
混淆的根源是VB和C#之间在十六进制文字方面的历史差异: 0x80000000 == 2147483648 in C# but not in VB.NET
在文字上没有类型后缀的情况下,VB.NET中的十六进制文字是Integer或Long类型,从不为无符号类型。
答案 2 :(得分:0)
以“ u”为前缀的原始数据类型是具有相同位大小的无符号版本。 实际上,这意味着它们不能存储负数,但另一方面,它们可以存储正负号的两倍。