[英]Converting VB6 varables to C#
我正在轉換舊的VB6代碼,並且這些常量有問題:
VB6代碼:
Private Const GENERIC_WRITE = &H40000000
Private Const GENERIC_READ = &H80000000
C#代碼:
private const int GENERIC_WRITE = 0x40000000;
private const uint GENERIC_READ = 0x80000000;
為什么第二行必須是uint
? 如果我將其作為int進行操作,會給我一個錯誤嗎?
正確的C#轉換是:
const int GENERIC_READ = unchecked((int)0x80000000);
在VB中,“ GENERIC_READ”隱式為具有負值的整數。 在C#中重現此錯誤的唯一方法是在未檢查的上下文中將無符號整數文字轉換為int。
混淆的根源是VB和C#之間在十六進制文字方面的歷史差異: 0x80000000 == 2147483648(在C#中但在VB.NET中沒有)
在文字上沒有類型后綴的情況下,VB.NET中的十六進制文字是Integer或Long類型,從不為無符號類型。
Int32的最大值是2,147,483,647,0x80000000的值是2,147,483,648或Int32.MaxValue + 1
。
使用uint
(或long
)可為您提供一個足以容納您分配的值的類型。
帶有“ u”前綴的原始數據類型是具有相同位大小的無符號版本。 實際上,這意味着它們不能存儲負數,但另一方面,它們可以存儲正負號的兩倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.