Comment afficher le code binaire du contenu d'une variable quelconque

Comment afficher le code binaire du contenu d'une variable quelconque - C - Programmation

Marsh Posté le 05-03-2008 à 15:42:19    

Bonjour à tous,
 
Je crois que le titre est très clair. J'ai tenté ce code :
 

Code :
  1. #include <stdio.h>
  2. #define TYPE int
  3. #define VALEUR_DE_VAR -8
  4. int main(void)
  5. {
  6. TYPE var = VALEUR_DE_VAR ;
  7. TYPE var_temp ;
  8. /*
  9. * Pour faire des opérations sur var
  10. * Il doit être du même type que var
  11. * Je pars du principe que 1 = 000...0001 en binaire
  12. * quel que soit le type utilisé (pas sûr ..?)
  13. */
  14. TYPE un = 1 ;
  15. int nbre_bits = sizeof(var) * 8 ;
  16.      
  17. printf( "Le contenu de \'var\' est codé sur un total de :\n" ) ;
  18. printf( "   --> %2d bytes (ou octets)\n" , sizeof(var) ) ;
  19. printf( "   --> %2d bits\n\n" , nbre_bits ) ;
  20. printf("Son code binaire est :\n" ) ;
  21. int i ;
  22. for( i = nbre_bits-1 ; i >= 0 ; i = i-1 )
  23.         {
  24.      
  25.         var_temp = (var >> i) ;
  26.         if( (var_temp & un) == 1 )
  27.                 {
  28.                 printf("1" ) ;
  29.                 }
  30.         else
  31.                 {
  32.                 printf("0" ) ;
  33.                 }
  34.      
  35.         }
  36. return(0) ;
  37.      
  38. }


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


Message édité par SiscoL le 05-03-2008 à 15:50:15
Reply

Marsh Posté le 05-03-2008 à 15:42:19   

Reply

Marsh Posté le 05-03-2008 à 15:49:00    

printf +%b ?


---------------
Töp of the plöp
Reply

Marsh Posté le 05-03-2008 à 15:56:50    

Et bien, ça c'est de la réponse concise.  ;)  
 
Hélas, le format %b n'existe pas ! Par contre le format "%X" existe et affiche le codage en écriture hexadécimal d'une variable, mais là encore, seulement pour un int.

Reply

Marsh Posté le 05-03-2008 à 16:20:26    

Effectivement j'ai dit n'importe quoi, dsl.
J'aurais pourtant juré que ça existait...


---------------
Töp of the plöp
Reply

Marsh Posté le 05-03-2008 à 18:47:40    

Et un truc du style :

Code :
  1. #define TYPE int
  2. #define TYPE_FMT "%d"
  3. int main(void)
  4.      TYPE test;
  5.      test = 0;
  6.      printf("Format is %s and value is " TYPE_FMT ".\n",TYPE_FMT,test);
  7. }


 

Reply

Marsh Posté le 05-03-2008 à 18:54:42    

ca veut quand même bien rien dire :E
 
Y a pas de format pour le binaire, faut te faire une chtite fonction de conversion base2->base10 et creer la chaine à la volée.

Reply

Marsh Posté le 05-03-2008 à 19:27:34    

Tu peux convertir en base 2 que des entiers, tu ne peux pas faire ça sur les flottants par exemple.
 
Ensuite, ton "#define TYPE int" c'est mal. Utilise typedef, et ce pour une raison simple :
#define TYPE int*
=> que se passe-t-il si tu écris : "TYPE a, b, c" ? [:opus dei]
 
De plus, tu utilises un magic number : 8. Je trouve mieux d'utiliser CHAR_BITS dans limits.h qui définit le nombre de bits de la plus petite entité allouable de la machine pour laquelle tu compiles. Ok >99% des machines actuelles ont un byte == 8 bits, mais ce n'était pas le cas avant, et rien ne dit que ça le sera dans le futur. :o
 

Reply

Marsh Posté le 05-03-2008 à 19:31:49    

Tu peux faire un truc comme ça par exemple

Code :
  1. double dVal = (double) 1,5;
  2. char *p = (char *)&dVal;
  3. size_t i;
  4. for(i = 0; i < sizeof(dVal); i++, p++)
  5.   affiche_octet(*p);

Reply

Marsh Posté le 06-03-2008 à 00:35:51    

En fait, 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.
 
Bravo à Trap D, car je crois bien qu'il a trouvé la façon de si prendre. En tout cas, c'est cette façon là qu'on m'a suggérée sur le fil en question. 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


Message édité par SiscoL le 06-03-2008 à 00:41:09
Reply

Marsh Posté le 06-03-2008 à 09:20:57    

Par le truchement d'un memcpy, une solution propre vous obtiendriez (Yoda m'habite).

Reply

Marsh Posté le 06-03-2008 à 09:20:57   

Reply

Marsh Posté le 06-03-2008 à 09:38:03    

"un", "VALEUR_DE_VAR", "TYPE", toi tu sais choisir tes noms y'a pas à dire.


Message édité par matafan le 06-03-2008 à 09:38:12
Reply

Marsh Posté le 06-03-2008 à 11:59:48    

_darkalt3_ a écrit :

Effectivement j'ai dit n'importe quoi, dsl.
J'aurais pourtant juré que ça existait...


Pas en standard. C'est une extension supportée par certains compilateurs... (J'ai oui-dire qu'un KEIL 51 faisait ça...)
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 06-03-2008 à 12:08:41    

Emmanuel Delahaye a écrit :


Pas en standard. C'est une extension supportée par certains compilateurs... (J'ai oui-dire qu'un KEIL 51 faisait ça...)


Ok merci :jap:
Je dirai aussi selon mes souvenirs un peu flous que j'ai dû croiser ça sous environnement microsoft ...


---------------
Töp of the plöp
Reply

Marsh Posté le 06-03-2008 à 12:13:12    

Trap D a écrit :

Tu peux faire un truc comme ça par exemple

Code :
  1. double dVal = (double) 1,5;
  2. char *p = (char *)&dVal;
  3. size_t i;
  4. for(i = 0; i < sizeof(dVal); i++, p++)
  5.   affiche_octet(*p);



est-ce que ça peux poser de problème d'alignements ce genre de trucs ?

Reply

Marsh Posté le 06-03-2008 à 13:50:11    

Taz a écrit :


est-ce que ça peux poser de problème d'alignements ce genre de trucs ?

A quel type de problème penses-tu ?

Reply

Marsh Posté le 06-03-2008 à 14:43:25    

Trap D a écrit :

A quel type de problème penses-tu ?


à rien de particulier, je suis entrain de lire des docs, savoir si un char pourrait avoir une contrainte d'alignement plus forte / incompatible qu'un double.

Reply

Marsh Posté le 08-03-2008 à 00:05:53    

Taz a écrit :


à rien de particulier, je suis entrain de lire des docs, savoir si un char pourrait avoir une contrainte d'alignement plus forte / incompatible qu'un double.


un char est aligné avec tout par définition !


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 22-03-2008 à 20:07:13    

Emmanuel Delahaye a écrit :


un char est aligné avec tout par définition !


une citation stp ?

Reply

Marsh Posté le 22-03-2008 à 20:29:13    

Taz a écrit :


une citation stp ?


Rationale C99 : http://www.open-std.org/jtc1/sc22/ [...] eV5.10.pdf

Citation :


Rationale for
International Standard—
Programming Languages—
C
Revision 5.10
April-2003

 

6.5.4 Cast operators
<...>
The type char must have the least strict alignment of any type, so char* has often been used
as a portable type for representing arbitrary object pointers. This usage creates an unfortunate
30 confusion between the ideas of arbitrary pointer and character or string pointer. The new type
void*, which has the same representation as char*, is therefore preferable for arbitrary
pointers.
<...>

 


Message édité par Emmanuel Delahaye le 22-03-2008 à 20:31:59

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 23-03-2008 à 02:12:04    

merci

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed