2009-02-18 7 views

Répondre

15

Ne pas oublier comment negative numbers are expressed in binary, et que VB6 et VB.NET interprètent différemment des nombres comme & h8300.

Parce que & hEDB80000 ne correspond pas à 16 bits, VB l'interprète comme long (32 bits). Parce que le bit haut est défini, VB6 sait que c'est négatif.

Nous allons annuler la two's complement (dans un monde 32 bits) pour déterminer la valeur décimale

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

depuis le bit de signe a été défini, c'est -306708480

Parce que & h8300 tient dans 16 bits, VB l'interprète comme entier (16 bits). Parce que le bit haut est défini, VB6 sait que c'est négatif.

Nous allons détachez les deux complément de (dans un monde 16 bits)

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

depuis le bit de signe a été défini, c'est -32000. Lorsque l'addition se produit, les deux valeurs sont considérées comme longues (32 bits).

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

Mettons que revenir en deux dans l'hexagone du complément

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

Alors & hEDB78300 est la bonne réponse.


Notes:

Personnellement, je chose que la confusion se produit à cause des éléments suivants:

&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 

comme mentionné dans l'autre poste, vous pouvez contourner ce problème en marquant explicitement les valeurs que désire ardemment

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

Pouvez-vous élaborer là-dessus? Je ne vois pas comment le résultat de quelque chose de négatif plus un petit nombre positif finirait avec le même petit nombre. (Basculer en base10 ... -1000 + 97 = 903, pas quelque chose se terminant par 97.) Sa sortie se termine par "8300", qui est le nombre qu'il a ajouté. – JMD

+0

J'ai fait le calcul dans un calcul hexadécimal et j'obtiens son résultat attendu. Je ne dois pas voir la forêt pour les arbres. – JMD

+0

@JMD: VB6 fait les choses un peu bizarre, et interprète 0x8300 comme un nombre négatif, donc il sort étrange –

3

Fondamentalement parce que VB6 voit & h8300 en tant qu'entier ayant la valeur -32000.Pour obtenir les résultats que vous vous attendez auriez besoin pour marquer explicitement comme une longue: -

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

Ce que votre 'ETAIENT ajoutais un long à un interger. Pour ce faire, VB6 étend d'abord l'entier à un long, puisque & h8300 représente un nombre négatif le long auquel il est converti finit avec la valeur & hFFFF8300. Armé de cette valeur, vous pouvez voir que le résultat renvoyé par VB6 est correct.

FF + B8 = B7 with carry bit set 
FF + ED + carry bit = ED 
+0

+1 pour être succinct. (aussi, je pense que vous manquez un h sur & EDB80000) –

+0

Corrigé merci – AnthonyWJones

Questions connexes