Utilisez <iomanip>
les std::hex
. Si vous imprimez, envoyez-le simplement à std::cout
, sinon, utilisezstd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Vous pouvez ajouter le premier <<
avec << "0x"
ou ce que vous voulez si vous le souhaitez.
D'autres manips intéressants sont std::oct
(octal) etstd::dec
(retour au décimal).
Un problème que vous pouvez rencontrer est le fait que cela produit le nombre exact de chiffres nécessaires pour le représenter. Vous pouvez utiliser setfill
et setw
ceci pour contourner le problème:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Alors enfin, je suggérerais une telle fonction:
template< typename T >
std::string int_to_hex( T i )
{
std::stringstream stream;
stream << "0x"
<< std::setfill ('0') << std::setw(sizeof(T)*2)
<< std::hex << i;
return stream.str();
}
Kornel Kisielewicz
la source
int
type;)std::setw
besoins d'être sortie au flux pour chaque entier, alors questd::hex
,std::setfill
,std::uppercase
, ... ne doivent être envoyés au flux de sortie une fois. Cela semble incohérent?Pour le rendre plus léger et plus rapide, je suggère d'utiliser le remplissage direct d'une ficelle.
la source
double
etfloat
(et pas pour les pointeurs)0000FFFF
pour0xFFFF
. Je préfère avoir0xFFFF
en sortie.Utilisez
std::stringstream
pour convertir des entiers en chaînes et ses manipulateurs spéciaux pour définir la base. Par exemple comme ça:la source
Imprimez-le simplement sous forme de nombre hexadécimal:
la source
std::cout<<std::hex<<i<<std::dec;
, sinon tous les entiers qui sont diffusés plus tard seront en hexadécimal. Vous n'avez pas besoin de le faire pour les autres réponses qui utilisent,stringstream
car le flux est supprimé après son utilisation, mais ilcout
vit pour toujours.Vous pouvez essayer ce qui suit. Ça marche...
la source
to_string
fait partie de l'espacestd
de nom en C ++ 11Cette question est ancienne, mais je suis surpris de savoir pourquoi personne n'a mentionné
boost::format
:la source
la source
Grâce au commentaire de Lincoln ci-dessous, j'ai changé cette réponse.
La réponse suivante gère correctement les entiers 8 bits au moment de la compilation. Cependant, il nécessite C ++ 17. Si vous n'avez pas C ++ 17, vous devrez faire autre chose (par exemple, fournir des surcharges de cette fonction, une pour uint8_t et une pour int8_t, ou utiliser quelque chose en plus de "if constexpr", peut-être enable_if).
Réponse originale qui ne gère pas correctement les entiers 8 bits comme je le pensais:
La réponse de Kornel Kisielewicz est excellente. Mais un léger ajout permet de détecter les cas où vous appelez cette fonction avec des arguments de modèle qui n'ont pas de sens (par exemple, float) ou qui entraîneraient des erreurs de compilation désordonnées (par exemple, un type défini par l'utilisateur).
J'ai modifié ceci pour ajouter un appel à std :: to_string car les types entiers 8 bits (par exemple les
std::uint8_t
valeurs passées) àstd::stringstream
sont traités comme char, ce qui ne vous donne pas le résultat souhaité. Passer de tels entiers àstd::to_string
gère correctement et ne nuit pas à l'utilisation d'autres types d'entiers plus grands. Bien sûr, vous risquez de subir un léger impact sur les performances dans ces cas, car l'appel std :: to_string n'est pas nécessaire.Remarque: j'aurais juste ajouté ceci dans un commentaire à la réponse d'origine, mais je n'ai pas le représentant à commenter.
la source
char
(ce qui est distinct des deuxuint8_t
etint8_t
dans la plupart des implémentations (où ils sont respectivementunsigned char
etsigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
etc ...Pour ceux d'entre vous qui ont compris que beaucoup / la plupart d'entre
ios::fmtflags
eux ne fonctionnent passtd::stringstream
encore comme l'idée de modèle que Kornel avait publiée il y a longtemps, ce qui suit fonctionne et est relativement propre:la source
Je fais:
Jetez un œil à la réponse SO d'iFreilicht et au fichier d'en-tête de modèle requis à partir d'ici GIST !
la source
Jetez un œil à ma solution, [1] que j'ai copiée textuellement de mon projet, donc il y a un document d'API en allemand inclus. Mon objectif était de combiner flexibilité et sécurité avec mes besoins réels: [2]
0x
préfixe ajouté: l'appelant peut déciderlong long
[1] basé sur la réponse de Kornel Kisielewicz
[2] Traduit dans la langue de CppTest , voici comment il se lit:
la source
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Code pour votre référence:
la source
clear
lesstream
(il sera détruit lorsque la fonction revient sur la ligne suivante de toute façon). Vous pouvez éviter le nomhexStr
entièrement et justereturn sstream.str();
sansclear
ing et obtenir le même effet, ce qui réduit quatre lignes de code à un.sstream.clear();
? L'sstream
objet est automatiquement détruit à la fin de la portée, donc lereturn sstream.str();
ferait.sstream.clear
effacera simplement le contenu, avant que le flux ne se termine avec la fin de la portée (pour effacer tout indicateur d'échec et eof avec clear). En effet, lorsque la portée meurt, avec la durée de vie de la variable de flux, etsstream.str
peut donc être utilisée pour retourner par valeur. [Référence: cplusplus.com/reference/ios/ios/clear/]Ma solution. Seuls les types intégraux sont autorisés.
Mettre à jour. Vous pouvez définir le préfixe optionnel 0x dans le deuxième paramètre.
definition.h
main.cpp
Résultats:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe
fe
fe fffffffe
fffffffffffffffe
la source
Je voudrais ajouter une réponse pour profiter de la beauté du langage C ++. Son adaptabilité au travail à des niveaux élevés et bas. Bonne programmation.
Exemples:
la source
Utilisation du pointeur void:
Ajout de 0x:
Les sorties:
la source
0x69fec4 (adresse)
6946500 (adresse à déc)
0x69fec4 (adresse à déc, sortie en hexadécimal)
est allé instinctivement avec cette ...
int address = (int) & var;
vu cela ailleurs ...
adresse longue non signée = reinterpret_cast (& var);
le commentaire m'a dit que c'était correct ...
int address = (int) & var;
en parlant de légèreté bien couverte , où en êtes-vous? ils reçoivent trop de likes!
la source
unsigned long
maisstd::intptr_t
.intptr_t
peut stocker n'importe quel pointeur sur la plate-forme de construction; ce n'est pas [nécessairement] vrai deunsigned int
. Et, encore une fois, rien de tout cela n'est pertinent pour la question. Aucune autre réponse de ma part