Discussion: Output
Afficher un message
Vieux 07/03/2008, 13h47   #3
Michel Decima
Aucun Avatar
 
Messages: n/a
Hébergeur:
Par défaut Re: Output

Jean-Marc Bourguet a écrit :
> Guillaume GOURDIN <trash@hotmail.com> writes:
>
>> Bonjour à tous,
>>
>> j'ai un problème, le code suivat :
>>
>> uint8_t data1, data2;
>> cout << "0x" << hex << setw(4) << setfill('0') << data1 << "=";
>> cout << "0x" << hex << setw(2) << setfill('0') << data2 << endl;
>>
>> me sort l'output suivant :
>>
>> 0x00aa=0x0
>>
>> alors que je m'attendrais (et que je voudrais) quelque chose du genre:
>>
>> 0x00aa=0x00
>>
>> Vous avez des idées?

>
> Ce qui me surprend, c'est la partie aa. uint8_t est vraissemblablement un
> typedef sur unsigned char et donc data1 et data2 devraient etre affiche
> comme des caracteres, si data2 est \0, c'est pas trop etonnant que tu ne le
> voie pas mais tu devrais etre capable de le verifier (piper dans od, sortir
> vers un fichier et regarder avec un editeur hexa,...)


Et en plus, le resultat doit etre indefini, vu que data1 et data2 sont
utilisés avant leur initialisation. On en a parlé ici il n'y a pas si
longtemps

>
> Essaie
> cout << "0x" << hex << setw(4) << setfill('0') << unsigned(data1) << "=";
> cout << "0x" << hex << setw(2) << setfill('0') << unsigned(data2) << endl;


Ca donne bien le resultat attendu (avec des variables correctement
initialisees). A la premiere lecture, j'ai trouve etrange l'usage
explicite du prefixe "0x", parce qu'on peut l'obtenir avec le
manipulateur showbase (il faut aussi internal pour le remplissage).
On devrait donc obtenir le resultat comme ceci :

uint8_t data1 = 0xaa , data2 = 0x0 ;
cout << setw(6) << setfill('0')
<< hex << showbase << internal << unsigned(data1) << "=";
cout << setw(4) << setfill('0')
<< hex << showbase << unsigned(data2) << endl ;

Et la j'obtient:

0x00aa=0000

A ma grande surprise, showbase n'ajoute pas le prefixe de base pour
a valeur 0 ( il faut dire que ca ne sert a rien vu que 0 est commun
a toutes les bases ). Jusqu'a present je pensais que le prefixe etait
ajouté systematiquement, parce que je n'etait jamais tombé sur le
cas particulier de 0, ni vu dans aucune doc qu'il y avait un
comportement special.

Avec printf, le comportement est identique :

printf( "%#06x=%#04x", unsigned(data1), unsigned(data2) ) ;

0x00aa=0000

La, c'est quand meme plus clair, parce que le man printf(3) me
dit que pour le caractere #, on a

"For x and X conversions, a non-zero result has the string
0x (or 0X for X conversions) prepended to it."

Les deux langages on le meme comportement, au fond, c'est pratique,
mais est-ce que c'est standard ?












  Réponse avec citation
 
Page generated in 0,05324 seconds with 9 queries