2009-02-18 3 views

ответ

15

Не забывайте, как 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 
+0

Можете ли вы подробнее остановиться на этом? Я не вижу, как результат чего-либо отрицательного плюс небольшое положительное число заканчивается тем же самым маленьким числом. (Переключение на base10 ... -1000 + 97 = 903, а не на то, что заканчивается на 97.) Его вывод заканчивается на «8300», это номер, который он добавил. – JMD

+0

Я сделал математику в шестнадцатеричном calc, и я получаю ожидаемый результат. Я не должен видеть лес для деревьев. – JMD

+0

@JMD: VB6 делает что-то странное и интерпретирует 0x8300 как отрицательное число, так что это выходит странно –

3

Фундаментально, потому что 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 
+0

+1 за то, что он краток. (также, я думаю, что вам не хватает h on & EDB80000) –

+0

Исправлено спасибо – AnthonyWJones