Comment écrire un nombre négatif en binaire avec Excel
par
, 07/10/2021 à 14h14 (1498 Affichages)
Salut.
Dans ce billet de blog, je vous parlais de DECBIN(Nombre) qui convertit un décimal en binaire. Cette fonction est limitée à la plage de valeurs [-512 ; 511]. Elle utilise 9 bits pour les valeurs positives et passe le 10ième bit à 1 pour les valeurs négatives. Elle utilise la notation complément à 2 pour déterminer la valeur négative.
- La notation complément à 2? C'est quoi ce truc, Pierre?
- Ok, j'y reviens bientôt.
Cette fonction ne permet pas d'utiliser moins de bits pour la valeur négative, car c'est justement le fait qu'il y a 10 bits qui indique que la valeur est négative. En effet, si j'utilise la fonction inverse BINDEC pour transformer un binaire en décimal, je pourrais envoyer un binaire positif sur 9 bits, mais si je veux envoyer un négatif, je devrai utiliser le 10ième bit (celui de poids fort), à 1.
- Ben... Moi, je croyais que pour rendre un nombre négatif, il suffisait de mettre le bit de gauche à 1... 121 => 01111001 => -121 => 11111001
- Mais non, si tu additionnes 121 et -121, tu obtiens 0, ok?
- Heu... Oui, bien sûr...
- Si tu additionnes 01111001 et 11111001, tu n'obtiens pas 0, tu obtiens 101110010, soit 370 sur 9 bits, ou 114 sur 8 bits
- Ok, Pierre, t'es vraiment gentil, t'as sûrement raison, mais en fait, moi, je voudrais les nombres signés sur 8 bits, sur un octet. Pourquoi Excel l'a fait sur 10?
Pouquoi Excel l'a fait sur 10 octets, je n'en sais trop rien. Il y a peut-être une raison scientifique, mais je ne la connais pas. Perso, j'aurais apprécié que, sur 8, 10 ou x bits, on ait un second paramètre optionnel qui précise qu'on passe un nombre négatif en binaire, ç'eut été à mon sens plus simple => un truc du genre BINDEC(Valeur;[Négatif]) => =BINDEC("10000111";VRAI) =>-121 => =BINDEC("10000111") = 135.
- Dis, Pierre, c'est marrant ton truc...
- Ah oui? Quoi donc?
- Ben, 121 + 135, ça fait 256
- Ben oui, c'est lo-gi-que...
- Oui, enfin, logique ou pas, moi, je voudrais bien -121 sur 8 bits, sur un octet, et pas sur 10 bits. Ca rime à rien, leur truc...
- Ben, si tu veux -121 sur un octet, soit 8 bits, laisse tomber les deux premiers 1. Fastoche!
- ???
- Ben oui, c'est lo-gi-que...
- Ah oui, ça marche, mais comment ça se fait?
- C'est parce que c'est lo-gi-que...
- Grrrrrrrrrr
- Ok Je me calme... Pour comprendre pourquoi c'est logique, il faut comprendre ce que signifie la notation à 2.
Reprenons nos valeurs sur 8 bits et voyons comment on rend un binaire négatif. On va:
- inverser les 7 bits de poids faible;
- ajouter 1 au résultat;
- mettre le bit de poids fort à 1.
Comme cela, lorsque tu additionnes 121 et -121, tu obtiens 0 sur 8 bits et... 256 sur 9 bits... Et de même, si tu additionnes 95 et -95, tu obtiens 0 sur 8 bits, ou 256 sur 9 bits... Et 256, ça correspond à 121 + 135 (valeur non signée de -121 en binaire). Et 256, ça correspond aussi à 95 + 161 (valeur non signée de -95 en binaire)... Et donc, pour trouver la valeur binaire d'un nombre négatif sur 1 octet, tu peux donc retrancher ce nombre de 256 puis traduire le résultat en binaire...
Ok... Merci m'sieur... J'vais m'prendre une triple Karmeliet...