Не забывайте, как negative numbers are expressed in binary, и что VB6 и VB.NET интерпретируют номера как & h8300 по-разному.
Потому что & hEDB80000 не подходит в 16 бит, VB интерпретирует его как long (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
как упомянуто в другом посте, вы можете обойти эту проблему, явно маркировки значения, как тоскует
&h0004000& is interpreted as 16384
&h0008000& is interpreted as 32768
&h0010000& is interpreted as 65536
Можете ли вы подробнее остановиться на этом? Я не вижу, как результат чего-либо отрицательного плюс небольшое положительное число заканчивается тем же самым маленьким числом. (Переключение на base10 ... -1000 + 97 = 903, а не на то, что заканчивается на 97.) Его вывод заканчивается на «8300», это номер, который он добавил. – JMD
Я сделал математику в шестнадцатеричном calc, и я получаю ожидаемый результат. Я не должен видеть лес для деревьев. – JMD
@JMD: VB6 делает что-то странное и интерпретирует 0x8300 как отрицательное число, так что это выходит странно –