Use <iomanip>
's std::hex
. Se você imprimir, basta enviá-lo para std::cout
, caso contrário, usestd::stringstream
std::stringstream stream;
stream << std::hex << your_int;
std::string result( stream.str() );
Você pode anexar o primeiro <<
com << "0x"
ou o que quiser, se desejar.
Outras manips de interesse são std::oct
(octal) e std::dec
(de volta ao decimal).
Um problema que você pode encontrar é o fato de que isso produz a quantidade exata de dígitos necessários para representá-lo. Você pode usar setfill
e setw
isso para contornar o problema:
stream << std::setfill ('0') << std::setw(sizeof(your_type)*2)
<< std::hex << your_int;
Então, finalmente, sugiro uma função:
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();
}
int
tipo;)std::setw
precisa ser saída para o fluxo para cada int, enquantostd::hex
,std::setfill
,std::uppercase
, ... só precisa ser enviado para o fluxo de saída uma vez. Isso parece inconsistente?Para torná-lo mais leve e rápido, sugiro usar o preenchimento direto de uma corda.
fonte
double
efloat
(e não para ponteiros)0000FFFF
para0xFFFF
. Eu prefiro ter0xFFFF
como saída.Use
std::stringstream
para converter números inteiros em strings e seus manipuladores especiais para definir a base. Por exemplo, assim:fonte
Basta imprimi-lo como um número hexadecimal:
fonte
std::cout<<std::hex<<i<<std::dec;
, caso contrário, todos os números inteiros que serão transmitidos posteriormente serão em hexadecimal. Você não precisa fazer isso para as outras respostas que usamstringstream
porque o fluxo é descartado após ser usado, mascout
vive para sempre.Você pode tentar o seguinte. Está funcionando...
fonte
to_string
é parte do namespacestd
em C ++ 11Esta pergunta é antiga, mas estou surpreso por que ninguém mencionou
boost::format
:fonte
fonte
Graças ao comentário de Lincoln abaixo, alterei esta resposta.
A resposta a seguir lida corretamente com entradas de 8 bits em tempo de compilação. No entanto, eles exigem C ++ 17. Se você não possui C ++ 17, precisará fazer outra coisa (por exemplo, fornecer sobrecargas dessa função, uma para uint8_t e outra para int8_t, ou usar algo além de "if constexpr", talvez enable_if).
Resposta original que não lida com ints de 8 bits corretamente como eu pensava:
A resposta de Kornel Kisielewicz é ótima. Porém, um pequeno acréscimo ajuda a capturar casos em que você está chamando essa função com argumentos de modelo que não fazem sentido (por exemplo, flutuação) ou que resultariam em erros confusos do compilador (por exemplo, tipo definido pelo usuário).
Eu editei isso para adicionar uma chamada para std :: to_string porque os tipos inteiros de 8 bits (por exemplo,
std::uint8_t
valores passados)std::stringstream
são tratados como char, o que não fornece o resultado desejado. Passar esses números inteiros parastd::to_string
manipulá-los corretamente e não prejudica as coisas ao usar outros tipos inteiros maiores. É claro que você pode sofrer um leve impacto no desempenho nesses casos, pois a chamada std :: to_string é desnecessária.Nota: eu teria acabado de adicionar isso em um comentário à resposta original, mas não tenho o representante para comentar.
fonte
char
(que é diferente da maioriauint8_t
eint8_t
na maioria das implementações (onde elas são respectivamenteunsigned char
esigned char
)).... && !std::is_same_v<char, T> && !std::is_same_v<bool, T>
etc ...Para aqueles de vocês que descobriram que muitos / a maioria
ios::fmtflags
ainda não trabalhastd::stringstream
como a ideia de modelo que Kornel postou quando, o seguinte funciona e é relativamente limpo:fonte
Eu faço:
Dê uma olhada na resposta SO da iFreilicht e no arquivo de cabeçalho do modelo necessário a partir daqui GIST !
fonte
Basta dar uma olhada na minha solução, [1] que eu copiei literalmente do meu projeto, para que haja um documento de API em alemão incluído. Meu objetivo era combinar flexibilidade e segurança às minhas necessidades reais: [2]
0x
prefixo adicionado: o chamador pode decidirlong long
[1] Com base na resposta de Kornel Kisielewicz.
[2] Traduzido para o idioma do CppTest , é assim que se lê:
fonte
TEST_ASSERT(int_to_hex(short(0x12)) == "0012");
Código para sua referência:
fonte
clear
assstream
(elas serão destruídas quando a função retornar na próxima linha de qualquer maneira). Você pode evitar o nomehexStr
completamente e apenasreturn sstream.str();
semclear
ing e obter o mesmo efeito, reduzindo quatro linhas de código para uma.sstream.clear();
? Osstream
objeto é destruído automaticamente no final do escopo, e oreturn sstream.str();
faria.sstream.clear
apenas limpará o conteúdo antes que o fluxo termine com o escopo final (para limpar qualquer falha e sinalizadores de eof com limpeza). De fato, quando o escopo morre, com a vida útil da variável de fluxo e, portanto,sstream.str
pode ser usado para retornar por valor. [Referência: cplusplus.com/reference/ios/ios/clear/]Minha solução Somente tipos integrais são permitidos.
Atualizar. Você pode definir o prefixo opcional 0x no segundo parâmetro.
definition.h
main.cpp
Resultados:
0xfe
0xfe
0xfffffffe
0xfffffffffffffffe
fe
fe fffffffe
fffffffffffffffe
fonte
Gostaria de adicionar uma resposta para apreciar a beleza da linguagem C ++. Sua adaptabilidade para trabalhar em níveis altos e baixos. Feliz programação.
Exemplos:
fonte
Usando ponteiro nulo:
Adicionando 0x:
Saídas:
fonte
0x69fec4 (endereço)
6946500 (endereço para dec)
0x69fec4 (endereço para dec, saída em hexadecimal)
instintivamente foi com isso ...
int address = (int) & var;
vi isso em outro lugar ...
endereço longo não assinado = reinterpret_cast (& var);
o comentário me disse que isso está correto ...
int address = (int) & var;
falando de leveza bem coberta , onde você está? eles estão recebendo muitos gostos!
fonte
unsigned long
masstd::intptr_t
.intptr_t
pode armazenar qualquer ponteiro na plataforma de construção; isso não é [necessariamente] verdadeirounsigned int
. E, novamente, nada disso é relevante para a questão. Sem respostas adicionais de mim