Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2721 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1697629
SiscoL
Posté le 05-03-2008 à 15:42:19  profilanswer
 

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
mood
Publicité
Posté le 05-03-2008 à 15:42:19  profilanswer
 

n°1697639
_darkalt3_
Proctopathe
Posté le 05-03-2008 à 15:49:00  profilanswer
 

printf +%b ?


---------------
Töp of the plöp
n°1697667
SiscoL
Posté le 05-03-2008 à 15:56:50  profilanswer
 

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.

n°1697724
_darkalt3_
Proctopathe
Posté le 05-03-2008 à 16:20:26  profilanswer
 

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


---------------
Töp of the plöp
n°1697828
dreameddea​th
Posté le 05-03-2008 à 18:47:40  profilanswer
 

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. }


 

n°1697830
Joel F
Real men use unique_ptr
Posté le 05-03-2008 à 18:54:42  profilanswer
 

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.

n°1697837
Elmoricq
Modérateur
Posté le 05-03-2008 à 19:27:34  profilanswer
 

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
 

n°1697839
Trap D
Posté le 05-03-2008 à 19:31:49  profilanswer
 

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);

n°1697908
SiscoL
Posté le 06-03-2008 à 00:35:51  profilanswer
 

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
n°1697957
tbp
Posté le 06-03-2008 à 09:20:57  profilanswer
 

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

mood
Publicité
Posté le 06-03-2008 à 09:20:57  profilanswer
 

n°1697966
matafan
Posté le 06-03-2008 à 09:38:03  profilanswer
 

"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
n°1698134
Emmanuel D​elahaye
C is a sharp tool
Posté le 06-03-2008 à 11:59:48  profilanswer
 

_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/
n°1698142
_darkalt3_
Proctopathe
Posté le 06-03-2008 à 12:08:41  profilanswer
 

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
n°1698147
Taz
bisounours-codeur
Posté le 06-03-2008 à 12:13:12  profilanswer
 

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 ?

n°1698224
Trap D
Posté le 06-03-2008 à 13:50:11  profilanswer
 

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 ?

n°1698264
Taz
bisounours-codeur
Posté le 06-03-2008 à 14:43:25  profilanswer
 

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.

n°1699188
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-03-2008 à 00:05:53  profilanswer
 

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/
n°1706630
Taz
bisounours-codeur
Posté le 22-03-2008 à 20:07:13  profilanswer
 

Emmanuel Delahaye a écrit :


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


une citation stp ?

n°1706634
Emmanuel D​elahaye
C is a sharp tool
Posté le 22-03-2008 à 20:29:13  profilanswer
 

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/
n°1706676
Taz
bisounours-codeur
Posté le 23-03-2008 à 02:12:04  profilanswer
 

merci


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
validation code anti-spamProblème afficher/montrer DIV
[RESOLU] Simplifier mon code de date sur 7 jours dans menu deroulant[C pour PIC] Variable en I2C
Compréhension ligne de code ?probléme pasage texte dans une variable
[Résolu] Problème de variable qui veut pas sortir d'une fonction.récupérer le code HTMl à partir d'une page web
code paypal dysfonctionement du forumscript de copie de contenu d'un cdrom sur le bureau
Plus de sujets relatifs à : Comment afficher le code binaire du contenu d'une variable quelconque


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR