#1 Le 05/03/2008, à 15:49
- SiscoL
Comment afficher le code binaire du contenu d'une variable quelconque
Bonjour à tous,
Je crois que le titre est très clair. J'ai tenté ce code :
#include <stdio.h>
#define TYPE int
#define VALEUR_DE_VAR -8
int main(void)
{
TYPE var = VALEUR_DE_VAR ;
TYPE var_temp ;
/*
* Pour faire des opérations sur var
* Il doit être du même type que var
* Je pars du principe que 1 = 000...0001 en binaire
* quel que soit le type utilisé (pas sûr ..?)
*/
TYPE un = 1 ;
int nbre_bits = sizeof(var) * 8 ;
printf( "Le contenu de \'var\' est codé sur un total de :\n") ;
printf( " --> %2d bytes (ou octets)\n" , sizeof(var) ) ;
printf( " --> %2d bits\n\n" , nbre_bits ) ;
printf("Son code binaire est :\n") ;
int i ;
for( i = nbre_bits-1 ; i >= 0 ; i = i-1 )
{
var_temp = (var >> i) ;
if( (var_temp & un) == 1 )
{
printf("1") ;
}
else
{
printf("0") ;
}
}
return(0) ;
}
Est-il correct ? etc.
Il ne marche que pour une variable de type int. Il plante pour une variable de type float par exemple. Or le titre est clair : "comment afficher le code binaire du contenu d'une variable quelconque", donc par exemple de type float.
En fait, j'ai déjà eu une discussion là dessus sur un autre forum : ici. Mais j'ai l'impression que ce fil est terminé et je reste un peu sur ma faim. C'est pourquoi je tente le coup ici.
Merci d'avance.
François
PS : Attention je débute
Dernière modification par SiscoL (Le 05/03/2008, à 15:50)
François
Hors ligne
#2 Le 05/03/2008, à 16:37
- Nasman
Re : Comment afficher le code binaire du contenu d'une variable quelconque
Pour afficher le code binaire d'un flottant il est peut être bon de se renseigner sur la façon dont ce type de données est codé (voir datasheets Intel).
De mémoire pour un flottant 32 bits (simple précision) c'est codé ainsi:
SEEEEEEE EMMMMMMM MMMMMMMM MMMMMMMM
S=signe (0 si >=0 1 si <0)
E=exposant+127
M=mantisse
Exemple codage de pi=3,1415926
en binaire
pi=1*2**1+1*2**0+0*2**(-1)+0*2**(-2)+1*2**(-3)+0*2**(-4)+0*2**(-5)+1*2**(-6)+...
retraduit en
pi=2**1*(1+1*2**(-1)+0*2**(-2)+0*2**(-3)+1*2**(-4)+0*2**(-5)+0*2**(-6)+1*2**(-7)+...)
A l'exposant de 1 on rajoute 127, ce qui donne 128
Pour la mantisse qui commence par 1+1*2**(-1)+0*2**(-2)+0*2**(-3)+1*2**(-4)+0*2**(-5)+0*2**(-6)+1*2**(-7)+...
on oublie le premier 1 car tous les nombres (non nuls) commenceront par 1.
Le codage sera (en commençant par les bits de poids les plus forts
Signe+Exposant+Mantisse tronquée, soit
0 10000000 1001001...
Soit en rassemblant par octets
01000000 01001001 ...
PC fixe sous Bionic 64 bits et portable avec Focal 64 bits
Hors ligne
#3 Le 05/03/2008, à 16:58
- SiscoL
Re : Comment afficher le code binaire du contenu d'une variable quelconque
Merci pour ta réponse. Mais je crois que je n'ai pas suffisamment bien expliqué ce que je voulais.
Ce que tu veux dire implicitement dans ta réponse, c'est qu'il faut que le programme crée le code binaire de toute pièce (c'est-à-dire en refaisant le travail de la machine) et donc il faut faire un programme qui travaille de manière différente en fonction du type de la variable par conséquent (chaque type étant codé de manière différente).
Moi, ce que j'espérais c'est un code qui marche pour une variable quelconque : un float par exemple, mais pourquoi pas un pointeur aussi. Bref, un code pour une variable totalement quelconque.
Ce que j'espère un peu, c'est un code où l'on va extirper le codage binaire, sans justement se poser la question de comment il a été fabriqué ce codage. Par exemple, si tu regardes bien mon code précédent, on se moque pas mal de comment a été codé un int (même si la méthode est connue ici). Juste avec les opérateurs sur les bits, j'ai pu afficher les bits un à un de la variable 'var', sans présager de rien sur la manière dont son contenu a été codé.
Je voudrais procédé de la même manière sur une variable quelconque.
François
Hors ligne
#4 Le 05/03/2008, à 17:09
- Le Farfadet Spatial
Re : Comment afficher le code binaire du contenu d'une variable quelconque
Salut à tous !
Je ne te conseille pas trop de tenter d'afficher la forme binaire d'un flottant, parce que c'est tout simplement incompréhensible...
De nos jours, tous les ordinateurs utilisent la norme IEEE 754, y compris les puces d'Intel de type x86 ou Core 2, les processeurs d'AMD et les PowerPC. Je ne sais pas quelle est ta machine, mais tu peux te renseigner sur ce format. Une première référence :
http://fr.wikipedia.org/wiki/IEEE_754
Sinon, tu peux aussi trouver des informations à ce sujet dans mon mémoire de master 2, que tu trouveras à cette adresse :
http://www.legos.obs-mip.fr/~lebars/publications
Son titre est : « implémentation de la méthode CESTAC dans la bibliothèque BLAS. »
D'autre part, ton code ne fonctionne pas avec les flottants car les opérateurs de décalages bit à bit ne sont pas définis pour ces types. La table de conversion que tu as utilisée (voire ton sujet sur le forum du site du zéro) ne fonctionnera pas, enfin pas si simplement. Donc, si tu veux afficher le code binaire, il va falloir que tu comprennes la norme et que tu fasses la conversion pas-à-pas. Tu vas voir : c'est galère, pour un résultat imbitable... Je te conseille donc de simplement te renseigner sur la norme, ce sera parfait !
À bientôt.
Le Farfadet Spatial
Hors ligne
#5 Le 06/03/2008, à 00:40
- SiscoL
Re : Comment afficher le code binaire du contenu d'une variable quelconque
Meric beaucoup pour les liens.
En fait, si je cherche à faire ce code c'est plus par "amusement" qu'autre chose.
Par je ne sais quel miracle, mon fil donné en lien au début a été relancé et je crois bien qu'une solution est sur le point d'être trouvée. Nous verrons si cela aboutit. Vous avez le lien et vous pourrez suivre la chose. Je garde un oeil quand même sur ce forum.
Merci pour vos réponses.
François
François
Hors ligne