187 votes

C++ cout valeurs hexagonales ?

Je veux le faire :

int a = 255; 
cout << a;

et faire apparaître FF dans la sortie, comment faire ?

252voto

Greg Hewgill Points 356191

Utilisez :

#include <iostream>

...

std::cout << std::hex << a;

Il y a de nombreuses autres options pour contrôler le formatage exact du nombre de sortie comme les zéros non significatifs et les majuscules et minuscules.

43 votes

Cela semble changer toutes les sorties futures de cout à hex ; donc si vous voulez seulement que 'a' soit imprimé en hex, vous pouvez vouloir quelque chose comme cout << hex << a << dec; pour le changer à nouveau.

19 votes

@ShreevatsaR Un problème avec la restauration du dec sur l'hex est que dec peut ne pas avoir été la valeur précédemment définie, en particulier si vous écrivez une méthode de bibliothèque générique. Cette question a quelques réponses sur la façon de stocker et de restaurer l'état. Vous pouvez sauvegarder l'état avec ios::fmtflags f(cout.flags()); et le restaurer avec out.flags(f); .

0 votes

Ensuite, rétablir par std::cout.flags(f);

48voto

Ashwin Points 17537

Pour manipuler le flux afin de l'imprimer en hexadécimal, utilisez la fonction hex manipulateur :

cout << hex << a;

Par défaut, les caractères hexadécimaux sont affichés en minuscules. Pour passer en majuscules, utilisez l'option uppercase manipulateur :

cout << hex << uppercase << a;

Pour revenir ultérieurement aux minuscules, utilisez la commande nouppercase manipulateur :

cout << nouppercase << b;

2 votes

Est nouppercase va changer la sortie en décimal ?

2 votes

Juste pour ajouter une note diverse, le snippet ci-dessus ne fera pas qu'une entrée "apple" devienne "APPLE".

47voto

Benoît Points 897

std::hex est défini dans <ios> qui est inclus par <iostream> . Mais pour utiliser des choses comme std::setprecision/std::setw/std::setfill /etc vous devez inclure <iomanip> .

23voto

Daniel Sloof Points 6161

Je comprends que ce n'est pas ce que l'OP a demandé, mais je pense quand même que cela vaut la peine de signaler comment le faire avec printf. Je préfère presque toujours l'utiliser plutôt que std::cout (même si je n'ai pas de connaissances préalables en C).

printf("%.2X", a);

2" définit la précision, "X" ou "x" définit la casse.

4 votes

Il y a depuis longtemps une bataille entre printf et cout. Bien sûr, cout a l'avantage de dériver de ostream et de bénéficier de tous les avantages de l'abstraction. Le C n'a pas de concept d'objets stream et donc printf et fprintf sont deux commandes différentes. Vraiment, cela aurait été bien en C si stdout était un FILE*. Cela aurait rendu les choses plus faciles.

12 votes

@rlbond stdout est un FILE * en C.

4 votes

C'est pourquoi printf("hello\n") est équivalent à fprintf(stdout, "hello\n") . Plus utilement, vous pouvez passer stdout (ou stdin ou stderr ) à une fonction qui prend un FILE* argument.

14voto

Gauz Points 73

Il existe également différents types de drapeaux et de masques que vous pouvez utiliser. Veuillez vous référer à http://www.cplusplus.com/reference/iostream/ios_base/setf/ pour plus d'informations.

#include <iostream>
using namespace std;

int main()
{
    int num = 255;
    cout.setf(ios::hex, ios::basefield);
    cout << "Hex: " << num << endl;

    cout.unsetf(ios::hex);
    cout << "Original format: " << num << endl;

    return 0;
}

5 votes

Je pense que le comportement de ce code est indéfini. Le setf efface les bits de ios::basefield, y compris ios::dec (par défaut pour les flux standard), et active uniquement ios::hex. Lorsque ios::hex est désactivé, chaque bit de ios::basefield est désactivé. Comment le numéro s'imprime-t-il la deuxième fois ? La preuve que les bits sont tous désactivés : ideone.com/fYXyh6 . Ceci est autorisé pour ios::floatfield selon Thinking in C++ vol 2 page 189, mais il n'en est pas de même pour ios::basefield.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X