VB6:当然这个简单的Hex加法错了吗?

时间:2009-02-18 21:23:32

标签: vb6 hex

我在一些VB6代码中得到奇怪的结果,我已经缩小到这个:

Debug.Print Hex(&hEDB80000 + &h8300)

显示 EDB78300

那不能正确吗?当然应该 EDB88300

我疯了吗?

2 个答案:

答案 0 :(得分:15)

不要忘记negative numbers are expressed in binary是怎样的,VB6和VB.NET对& h8300等数字的解释也不同。

因为& hEDB80000不适合16位,VB将其解释为(32位)。因为高位设置,VB6知道它是负的。

让我们撤消two's complement(在32位世界中)来计算小数值

(~&hEDB80000 + 1) = &h1247FFFF + 1 = &h12480000 = 306708480 

因为符号位已设置,即 -306708480

因为& h8300适合16位,VB将其解释为整数(16位)。因为设置了高位,所以VB6知道它是负数。

让我们撤消两个补码(在 16位世界中)

(~&h8300 + 1) = &h7DFF + 1 = &h7D00 = 32000

因为符号位已设置,所以 -32000 。当添加发生时,两个值都被认为是long(32位)。

(-306708480) + (-32000) = -306740480

让我们把它放回两个补码十六进制

~(306740480 - 1) = ~(&h12487D00 - 1) = ~(&h12487CFF) = &hEDB78300

所以& hEDB78300 是正确答案。


注意:

我个人认为由于以下因素而引起混淆:

&h0004000 is interpreted as  16384 // Fits in 16-bits, sign bit is not set
&h0008000 is interpreted as -32768 // Fits in 16-bits, sign bit is set
&h0010000 is interpreted as  65536 // Requires 32-bits, sign bit is not set

正如另一篇文章中所提到的,你可以通过明确地将值标记为longs来解决这个问题

&h0004000& is interpreted as  16384 
&h0008000& is interpreted as  32768 
&h0010000& is interpreted as  65536 

答案 1 :(得分:3)

Fundementally因为VB6将& h8300视为具有值-32000的整数。为了获得您期望的结果,您需要明确地将其标记为Long: -

Debug.Print Hex(&hEDB80000 + &h8300&)

你正在做的是给一个汉格添加一个龙。要做到这一点,VB6首先将Integer扩展为Long,因为& h8300表示负数,转换为Long的最终值为& hFFFF8300。使用该值可以看出VB6返回的结果是正确的。

FF + B8 = B7 with carry bit set
FF + ED + carry bit = ED
相关问题