2015-09-07 39 views
1

我最近正在將一些VB6代碼升級到VB.NET。出現的一個奇怪問題是short數據類型的差異。在VB6和VB.NET中對短值進行不同的處理?

原始VB6碼具有下面的行:

foobar(&H8589) 

其中foobar是接受一個short參數的函數。上面的代碼在VB6中工作正常。目的是將兩個字節傳遞給該函數,short似乎是一種適合的數據類型,因爲它代表2個字節。

一旦升級,代碼突然返回錯誤Constant value not representable in type 'Short'.所以我在MSDN, where it says閱讀有關此數據類型:

簽署的保全16位(2字節),從-32,768到32,767範圍內的值的整數。

所以我們將0x8589轉換爲DEC。變爲-31,351,這在該類型設定的邊界內。現在,奇怪的是:當我使用DEC值(foobar(-31351))調用函數時 - 它的工作原理!

所以你可能會問爲什麼我不會只使用DEC值。那麼,使用HEX的好處是每個查看代碼的人都能立即知道傳遞了哪些字節,在這種情況下哪些字節很重要。

所以:爲什麼我不能使用HEX表示法?這種差異記錄在某處嗎?有沒有一種方法可以在不改變函數的情況下使用HEX代碼(例如接受兩個Byte參數)?

+0

H8589將整數轉換爲34185值。這超出了短數據類型的邊界,這就是爲什麼你會遇到錯誤。 – Harsh

+1

這聽起來像你想要一個未簽名的短。 – SLaks

+0

@Harsh但用2個字節的寬度轉換,結果爲'-31351'。這似乎是VB6在內部所做的。我想知道它爲什麼會發生變化 - 升級引擎甚至沒有留下評論,但它確實是不兼容的。 –

回答

2

要使用負的十六進制int16常量,請在FFFF之前使用該值。看來十六進制常量在vb.net中是int32(至少)。

dim w as int16 
    w = &HFFFF8589 
+2

你也可以使用'S'的類型說明符字符:'Dim w As Int16 =&H8589S' –