Reconnaitre un hexadecimal négatif

Fermé
Pixelstock - Modifié par Pixelstock le 9/10/2011 à 11:50
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 - 9 oct. 2011 à 21:12
Bonjour,

Dans le cadre d'un projet, je dois réaliser un programme qui interprète une liste de commande. Certaines de ces commandes ont des arguments en hexadecimal qui peuvent être des valeurs négatives. La méthode utilisée est two's complement. Je n'arrive pas à différencier les valeurs positives et négatives.



Voici par exemple des lignes qui me posent problème:
- down4 fd8736d0
- down3 0c0000
- down3 46b9f2
- right3 ff2aaa

J'aimerai savoir quel est la méthode pour identifier si le nombre hexa est positif et négatif.

Merci d'avance pour votre aide.

1 réponse

nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
9 oct. 2011 à 12:14
Pour déterminer le signe en héxa, il faut connaitre la position du bit de poids le plus élevé, donc la taille de la variable, et si ce bit est à 1, la valeur est négative, positive sinon...
9
bonjour, pourriez-vous m'expliquer la méthode à partir de mes exemples ?
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
9 oct. 2011 à 17:13
Oui tout à fait, il ne manque pour ça qu'une information sur la taille des valeurs, car la définition du signe y est étroitement liée...
Mais si on part du principe que les valeurs sont en 32 bits, en héxa ça donne 8 chiffres pour définir chaque valeur,
ensuite soit il n'y a pas 8 chiffres, la valeur est donc forcément positive, soit il y a 8 chiffres, et si le chiffre le plus à gauche dépasse $7, la valeur est forcément négative, positive sinon.
Donc :
- down4 fd8736d0  -> 8 chiffres, et 8ème chiffre = $F : > $7 donc négatif
Le reste est inférieur à 8 chiffres, donc ils sont tous positifs :
- down3 0c0000
- down3 46b9f2
- right3 ff2aaa 
0
D'accord merci bien pour votre aide. J'ai juste une question pour les commandes down3 et right3. Enfaite, la taille des valeurs change suivant la commande. C'est l'indice à la fin qui l'indique. Le "3" signifie que l'argument à une longueur de 3 bytes. Ainsi, si j'ai bien compris, pour "right3 ff2aaa " la valeur est négative car le chiffre le plus à gauche dépasse 7 ?

Si c'est bien cela, pourriez-vous également m'indiquer la méthode de conversion pour passer d'un valeur hexadécimal négative à son équivalent en décimal. J'ai lu beaucoup de chose la dessus et j'ai peur de mettre complément embrouillé ! (à partir de fd8736d0 par exemple)

Merci !
0
nicocorico Messages postés 799 Date d'inscription dimanche 19 juin 2011 Statut Membre Dernière intervention 3 juillet 2018 138
Modifié par nicocorico le 9/10/2011 à 21:35
Oui c'est ça, dans le cas de 3 bytes significatifs, $FF2AAA est bien négatif.
Et pour convertir en décimal simplement, on commence par tester si la valeur est négative et si c'est le cas on le prend en compte dans la valeur décimale puis tu fais un complément à 2.
Ensuite il suffit de faire une boucle qui divise par 10 tant que la valeur est > 0, et chaques restes de division obtenus constituent les chiffres décimaux, en commençant par le plus faible...
0
Très bien merci ! Juste pour être sur :

ff2aaa <=> 111111110010101010101010 en binaire
complément à deux : 000000001101010101010110
000000001101010101010110 <=> 54614 et donc mon résultat est -54614

C'est correct ?
0