Bonjour,
Pour convertir une valeur numérique décimale en une chaîne de bits à afficher, j’utilise la fonction DecBin
suivante (la fonction Serial.print(chiffre, BIN)
permet de le faire directement) :
int entree;
char *DecBin (int n);
void setup() {
Serial.begin(9600);
}
void loop() {
while (Serial.available() !=0) {
entree = Serial.parseInt();
if (entree!=0) {
Serial.print("conversion en binaire de : ");
Serial.println(entree);
Serial.println (DecBin (entree));
}
}
}
char *DecBin (int n)
{
static char bin[8];
int x;
for (x= 0 ; x<8; x++)
{
bin[x] = n & 0x80 ? '1' : '0'; // 0x8000 pour 16 bits
n <<= 1;
}
bin[x] ='\0';
return(bin);
}
En fait si j’ai bien compris la fonction de conversion se résume à ces deux lignes de code :
1/ bin[x] = n & 0x80 ? '1' : '0'; // 0x8000 pour 16 bits
2/ n <<= 1;
- La première ligne applique un masque hexa de ET binaire à la valeur n, le masque équivaut à 10000000 en binaire. On utilise un opérateur ternaire donc si le bit de poids fort de n est armé la condition est
vraie bin[x] = 1
, sinonbin[x] = 0
; - La deuxième décale tous les bits de n d’une position à gauche. A chaque décalage une comparaison est effectuée.
En gros si n = 4 on obtient la chaîne bin = ‘00000100’ le microcontrôleur procède ainsi :
Pour stocker les nombres négatifs on utilise la représentation en complément à deux :
Prenons par exemple le nombre décimal -4 :
1/ on prend sa valeur positive soit 00000100 en binaire ;
2/ on lui applique l’opérateur de complément à 1 (~) ce qui donne une inversion des bits soit : 11111011 ;
3/ on ajoute un 1 binaire ce qui donne : 11111100 = -4.
Le bit de signe est passé à 1 et indique le nombre négatif, d’autre part si j’additionne 3 +(-4) cela fait en binaire 00000011 + 11111100 = 11111111. Pour l’addition j’utilise le mode de calcul suivant :
3 +(-4) donne donc le nombre binaire 11111111, son complément à deux est 00000001 soit 1 en décimal donc avec le bit de signe à 1 on obtient -1 en décimal.
En utilisant le complément à deux pour stocker les nombres négatifs cela permet donc de transformer une soustraction en addition (c’est une instruction simple pour le microcontrôleur ).
Maintenant si je reviens à la fonction DecBin et que j’utilise un masque 16 bits : 0x8000
-4 = 1111111111111100
alors qu’en 8bits -4 = 11111100
J’ai deux questions :
1/ est-ce que mon analyse de la fonction DecBin est correcte ?
2/ le codage de -4 en 16 bits est-il correct ?
Merci par avance à tous ceux qui voudront bien prendre le temps de me lire et de me répondre.