Langage C
Fermé
Vinc-Ims
Messages postés
1
Date d'inscription
jeudi 17 février 2011
Statut
Membre
Dernière intervention
17 février 2011
-
17 févr. 2011 à 22:31
pkjmr Messages postés 178 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 21 février 2011 - 21 févr. 2011 à 09:15
pkjmr Messages postés 178 Date d'inscription mercredi 30 mai 2007 Statut Membre Dernière intervention 21 février 2011 - 21 févr. 2011 à 09:15
A voir également:
- Langage C
- Langage ascii - Guide
- Langage binaire - Guide
- Pascal langage - Télécharger - Édition & Programmation
- Langage pascal - Télécharger - Édition & Programmation
- Débuter langage batch windows - Guide
2 réponses
Hxyp
Messages postés
401
Date d'inscription
vendredi 28 janvier 2011
Statut
Membre
Dernière intervention
27 avril 2014
54
Modifié par Hxyp le 19/02/2011 à 19:41
Modifié par Hxyp le 19/02/2011 à 19:41
Bonjour,
Pour la partie droite de la virgule c'est expliqué ici :
https://en.wikipedia.org/wiki/Single_precision#Converting_from_decimal_representation_to_binary32_format
12.375
12 devient 1100
ensuite pour la partie fractionnaire il faut la multiplier par 2 et récupérer la partie entière puis refaire jusqu'à ce que la partie fractionnaire soit à 0
.375*2=0.75 on prend le 0
.75*2=1.5 on prend le 1
.5*2=1.0 on prend le 1
.0*2=0... on arrête
.375 donne alors 011
12.375 fait 1100.011
on décale la virgule vers la gauche pour normaliser
1.100011 (le 1. est alors "implicite" on ne s'en sert pas pour créer le float on ne l'ajoute pas, mais ne pas oublier qu'il faut le rajouter lorsqu'on fait la conversion dans le sens inverse)
décalage de 3 donc la partie exposant du float fera
127+3 = 130 en binaire : 10000010
résultat :
signe = 0 ; expo = 10000010 ; fract : 100011 on ajoute les 0 manquants
0 10000010 10001100000000000000000
Si vous ne pouvez qu'utiliser des entiers pour faire la conversion, le 0.375 peut être converti en entier puis en utilisant *10^ on peut récupéré le 'binaire'
.375 devient 375 qui fait 3*10^2 + 7*10^1 + 5*10^0
la "base" de 375 est alors inférieur à 1*10^3, si supérieur ou égale c'est 1, si inférieur c'est 0
375*2=750 inférieur à 1*10^3 on affiche 0
750*2=1500 supérieur à 1*10^3, on affiche 1 puis on retire le 1*10^3 et on continu
500*2=1000 égale 1*10^3 on affiche 1 et on retire 1*10^3 il n'y a plus rien
375 = 011
Pour la partie droite de la virgule c'est expliqué ici :
https://en.wikipedia.org/wiki/Single_precision#Converting_from_decimal_representation_to_binary32_format
12.375
12 devient 1100
ensuite pour la partie fractionnaire il faut la multiplier par 2 et récupérer la partie entière puis refaire jusqu'à ce que la partie fractionnaire soit à 0
.375*2=0.75 on prend le 0
.75*2=1.5 on prend le 1
.5*2=1.0 on prend le 1
.0*2=0... on arrête
.375 donne alors 011
12.375 fait 1100.011
on décale la virgule vers la gauche pour normaliser
1.100011 (le 1. est alors "implicite" on ne s'en sert pas pour créer le float on ne l'ajoute pas, mais ne pas oublier qu'il faut le rajouter lorsqu'on fait la conversion dans le sens inverse)
décalage de 3 donc la partie exposant du float fera
127+3 = 130 en binaire : 10000010
résultat :
signe = 0 ; expo = 10000010 ; fract : 100011 on ajoute les 0 manquants
0 10000010 10001100000000000000000
Si vous ne pouvez qu'utiliser des entiers pour faire la conversion, le 0.375 peut être converti en entier puis en utilisant *10^ on peut récupéré le 'binaire'
.375 devient 375 qui fait 3*10^2 + 7*10^1 + 5*10^0
la "base" de 375 est alors inférieur à 1*10^3, si supérieur ou égale c'est 1, si inférieur c'est 0
375*2=750 inférieur à 1*10^3 on affiche 0
750*2=1500 supérieur à 1*10^3, on affiche 1 puis on retire le 1*10^3 et on continu
500*2=1000 égale 1*10^3 on affiche 1 et on retire 1*10^3 il n'y a plus rien
375 = 011
pkjmr
Messages postés
178
Date d'inscription
mercredi 30 mai 2007
Statut
Membre
Dernière intervention
21 février 2011
33
21 févr. 2011 à 09:15
21 févr. 2011 à 09:15
(edit: j'ai transformé le commentaire en réponse)
Pour la deuxième question : l'opérateur "non binaire" inverse bien chaque bit on appelle ça le complément à 1.
Avec un codage sur 8 bits on passe de
maintenant pour trouver le ?? en décimal il faut d'abord enlever le bit de poids fort qui est le bit de signe. Cela revient à soustraire ce bit à notre nombre, c'est à dire faire:
on obtient
ce qui est égal à 47 en décimal, d'où ton -47. Cependant il ne fallait pas s'arrêter là, car les ordinateurs utilisent la notation en complément à deux ; cela implique que le nombre négatif avec la plus petite valeur absolue est aussi le plus petit (ce qui est contraire au sens habituel, par ex. pour -1, -2, -3, -4, -5 on voit bien que la valeur absolue croit alors que les nombres décroissent).
Donc ce 47 il faut lui soustraire encore une fois 2^7 pour obtenir -81. Regarde le schéma dans cette page http://fr.wikipedia.org/wiki/Complément_à_deux
on voit bien que les positifs sont "translatés" pour obtenir les négatifs (au bit de signe près) d'où l'évidence de la nécessité de cette soustraction.
Par ailleurs en complément à deux on trouve -81 quelle que soit la taille de codage des nombres. Par contre le fait que tu aies trouvé -47 prouve que tu t'es basé sur une représentation sur 8 bits. Or en C les entiers sont codés sur 32 bits ! Voir https://forums.commentcamarche.net/forum/affich-37622105-langage-c-les-types-de-donnees
Pour la deuxième question : l'opérateur "non binaire" inverse bien chaque bit on appelle ça le complément à 1.
Avec un codage sur 8 bits on passe de
80 = 0101 0000 à ?? = 1010 1111
maintenant pour trouver le ?? en décimal il faut d'abord enlever le bit de poids fort qui est le bit de signe. Cela revient à soustraire ce bit à notre nombre, c'est à dire faire:
1010 1111 - 1000 0000 = 1010 1111 - 2^7
on obtient
0010 1111
ce qui est égal à 47 en décimal, d'où ton -47. Cependant il ne fallait pas s'arrêter là, car les ordinateurs utilisent la notation en complément à deux ; cela implique que le nombre négatif avec la plus petite valeur absolue est aussi le plus petit (ce qui est contraire au sens habituel, par ex. pour -1, -2, -3, -4, -5 on voit bien que la valeur absolue croit alors que les nombres décroissent).
Donc ce 47 il faut lui soustraire encore une fois 2^7 pour obtenir -81. Regarde le schéma dans cette page http://fr.wikipedia.org/wiki/Complément_à_deux
on voit bien que les positifs sont "translatés" pour obtenir les négatifs (au bit de signe près) d'où l'évidence de la nécessité de cette soustraction.
Par ailleurs en complément à deux on trouve -81 quelle que soit la taille de codage des nombres. Par contre le fait que tu aies trouvé -47 prouve que tu t'es basé sur une représentation sur 8 bits. Or en C les entiers sont codés sur 32 bits ! Voir https://forums.commentcamarche.net/forum/affich-37622105-langage-c-les-types-de-donnees