Valeurs hexadécimales de cout C ++?

144

Je veux faire:

int a = 255; 
cout << a;

et lui montrer FF dans la sortie, comment pourrais-je faire cela?

Cœur
la source

Réponses:

201

Utilisation:

#include <iostream>

...

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

Il existe de nombreuses autres options pour contrôler le formatage exact du numéro de sortie , telles que les zéros non significatifs et les majuscules / minuscules.

Greg Hewgill
la source
34
Cela semble changer toute la sortie future de cout en hexadécimal; donc si vous voulez seulement que 'a' soit imprimé en hexadécimal, vous voudrez peut-être quelque chose comme cout << hex << a << dec;le changer.
ShreevatsaR
16
@ShreevatsaR Un problème avec la restauration de dec sur hex est que dec n'a peut-être pas été la valeur précédemment définie, surtout 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 enregistrer l'état avec ios::fmtflags f(cout.flags());et le restaurer avec out.flags(f);.
jtpereyda
Puis restaurer parstd::cout.flags(f);
truthadjustr
43

std::hexest défini dans <ios>lequel est inclus par <iostream>. Mais pour utiliser des éléments comme std::setprecision/std::setw/std::setfill/ etc, vous devez inclure <iomanip>.

Benoît
la source
42

Pour manipuler le flux à imprimer en hexadécimal, utilisez le hexmanipulateur:

cout << hex << a;

Par défaut, les caractères hexadécimaux sont affichés en minuscules. Pour le changer en majuscules, utilisez le uppercasemanipulateur:

cout << hex << uppercase << a;

Pour remettre ultérieurement la sortie en minuscules, utilisez le nouppercasemanipulateur:

cout << nouppercase << b;
Ashwin Nanjappa
la source
2
Va nouppercase- t- il changer la sortie en décimal?
Cœur
Juste pour ajouter une note diverse, l'extrait ci-dessus ne fera pas une entrée "apple" devenant "APPLE".
truthadjustr
20

Si vous souhaitez imprimer un seul nombre hexadécimal, puis revenir au décimal, vous pouvez utiliser ceci:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
la source
13

Je comprends que ce n'est pas ce que OP a demandé, mais je pense toujours qu'il vaut la peine de souligner comment le faire avec printf. Je préfère presque toujours l'utiliser sur std :: cout (même sans arrière-plan C précédent).

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

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

Daniel Sloof
la source
4
Il y a longtemps eu une bataille printf contre cout. Bien sûr, le cout a la belle propriété qu'il dérive de ostream et obtient tous les avantages de l'abstraction. C n'a pas de concept d'objets de flux et donc printf et fprintf sont 2 commandes différentes. Vraiment, cela aurait été bien en C si stdout était un FILE *. Aurait rendu les choses plus faciles.
rlbond
11
@rlbond stdout est un FICHIER * dans C.
Étienne
4
C'est pourquoi printf("hello\n")équivaut à fprintf(stdout, "hello\n"). Plus utilement, vous pouvez passer stdout(ou stdin, ou stderr) à une fonction qui prend un FILE*argument.
Keith Thompson
11

Il existe différents types de drapeaux et de masques que vous pouvez également utiliser. Veuillez consulter 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;
}
Gaurav
la source
5
Je pense que le comportement de ce code n'est pas défini. Le setf efface les bits ios :: basefield, y compris ios :: dec (par défaut pour les flux standard), et définit uniquement ios :: hex. Lorsque ios :: hex n'est pas défini, chaque bit dans ios :: basefield est désactivé. Comment ça a été imprimé la deuxième fois? preuve que les bits ne sont pas définis : 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.
Joel Sjögren
10

std::hex vous obtient le formatage hexadécimal, mais c'est une option avec état, ce qui signifie que vous devez enregistrer et restaurer l'état ou cela aura un impact sur toutes les sorties futures.

Revenir naïvement à std::decn'est bon que si c'est là que les indicateurs étaient auparavant, ce qui peut ne pas être le cas, en particulier si vous écrivez une bibliothèque.

#include <iostream>
#include <ios>

...

std::ios_base::fmtflags f( cout.flags() );  // save flags state
std::cout << std::hex << a;
cout.flags( f );  // restore flags state

Cela combine la réponse de Greg Hewgill et les informations d' une autre question .

jtpereyda
la source
2

Utilisez std::uppercaseet std::hexpour formater la variable entière aà afficher au format hexadécimal.

#include <iostream>
int main() {
   int a = 255;

   // Formatting Integer
   std::cout << std::uppercase << std::hex << a << std::endl; // Output: FF
   std::cout << std::showbase  << std::hex << a << std::endl; // Output: 0XFF
   std::cout << std::nouppercase << std::showbase  << std::hex << a << std::endl; // Output: 0xff

   return 0;
}
va6un
la source