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
Bonsoir,
J'étudie les bases du Langage C en cours et j'ai quelques questions qui s'y rapportent plus ou moins.
Premièrement, je n'arrive pas à convertir un réel en binaire. Je n'ai pas de soucis pour la partie entière, c'est bien sur la partie du côté droit de la virgule qui me pose problème. Je sais que je dois décomposer en base 2 de puissances négatives mais j'aimerais connaitre une méthode comme pour les divisions euclidiennes successives par 2 pour la partie entière. Merci de si possible illustrer cela par exemple :x .
Dans un second temps, je n'arrive pas à comprendre le résultat de l'exo suivant : ~(a<<4)=-81 où a=5. Je comprends que (a<<4)=80 mais je trouve que ~(a<<4)=-47 ( si c'est bien un entier signé :s ).

Je vous remercie par avance.
A voir également:

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
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
0
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
(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
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
0