gpt4 book ai didi

VB6:这个简单的十六进制加法肯定是错误的吗?

转载 作者:行者123 更新时间:2023-12-03 18:24:57 25 4
gpt4 key购买 nike

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

Debug.Print Hex(&hEDB80000 + &h8300)

展会 EDB78300

那不能吧?当然应该是 EDB88300 ?

我要疯了吗?

最佳答案

别忘了如何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 .当加法发生时,两个值都被认为是长整数(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

如另一篇文章中所述,您可以通过将值显式标记为 long 来解决此问题
&h0004000& is interpreted as  16384 
&h0008000& is interpreted as 32768
&h0010000& is interpreted as 65536

关于VB6:这个简单的十六进制加法肯定是错误的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/562899/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com