2015-09-07 46 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' –