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?

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.


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


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;

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;

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.


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

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 .


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;
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.