C ++ valores hexadecimais?

144

Eu quero fazer:

int a = 255; 
cout << a;

e mostrar FF na saída, como eu faria isso?

Cœur
fonte

Respostas:

201

Usar:

#include <iostream>

...

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

Existem muitas outras opções para controlar a formatação exata do número de saída , como zeros à esquerda e maiúsculas / minúsculas.

Greg Hewgill
fonte
34
Isso parece alterar toda a saída futura de cout para hex; portanto, se você deseja que apenas 'a' seja impresso em hexadecimal, convém cout << hex << a << dec;alterá-lo novamente.
ShreevatsaR
16
@ShreevatsaR Um problema ao restaurar dec sobre hex é que dec pode não ter sido o valor definido anteriormente, especialmente se você estiver escrevendo um método genérico de biblioteca. Esta pergunta tem algumas respostas sobre como armazenar e restaurar o estado. Você pode salvar o estado ios::fmtflags f(cout.flags());e restaurá-lo com out.flags(f);.
jtpereyda
Restaurar entãostd::cout.flags(f);
truthadjustr 14/03
43

std::hexé definido no <ios>qual é incluído por <iostream>. Mas para usar coisas como std::setprecision/std::setw/std::setfill/ etc, você deve incluir <iomanip>.

Benoît
fonte
42

Para manipular o fluxo para imprimir em hexadecimal, use o hexmanipulador:

cout << hex << a;

Por padrão, os caracteres hexadecimais são impressos em minúsculas. Para alterá-lo para maiúsculas, use o uppercasemanipulador:

cout << hex << uppercase << a;

Para alterar posteriormente a saída para minúscula, use o nouppercasemanipulador:

cout << nouppercase << b;
Ashwin Nanjappa
fonte
2
Está nouppercaseindo para mudar a parte traseira de saída para decimal?
Coeur
Apenas para adicionar uma nota diversa, o trecho acima não fará com que uma entrada "apple" se torne "APPLE".
truthadjustr 14/03
20

Se você deseja imprimir um único número hexadecimal e, em seguida, reverter para o decimal, use:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
fonte
13

Entendo que não é isso que o OP solicitou, mas ainda acho que vale a pena apontar como fazê-lo com o printf. Eu quase sempre prefiro usá-lo sobre std :: cout (mesmo sem o fundo C anterior).

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

'2' define a precisão, 'X' ou 'x' define maiúsculas e minúsculas.

Daniel Sloof
fonte
4
Há muito tempo uma batalha contra impressão e cout. Obviamente, o cout tem a propriedade agradável que deriva do ostream e obtém todos os benefícios da abstração. C não tem conceito de objetos de fluxo e, portanto, printf e fprintf são 2 comandos diferentes. Realmente, seria bom em C se stdout fosse um ARQUIVO *. Teria facilitado as coisas.
Rllond 13/05/09
11
@rlbond stdout é um ARQUIVO * em C.
Étienne
4
É por isso que printf("hello\n")é equivalente a fprintf(stdout, "hello\n"). Mais útil, você pode passar stdout(ou stdin, ou stderr) para uma função que recebe um FILE*argumento.
21416 Keith Thompson
11

Existem diferentes tipos de bandeiras e máscaras que você também pode usar. Consulte http://www.cplusplus.com/reference/iostream/ios_base/setf/ para obter mais informações.

#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
fonte
5
Eu acho que o comportamento desse código é indefinido. O setf limpa os bits ios :: basefield, incluindo ios :: dec (padrão para fluxos padrão) e define apenas ios :: hex. Quando o ios :: hex está desabilitado, todos os bits no ios :: basefield ficam desabilitados. Como num impresso pela segunda vez? evidência de que todos os bits estão desmarcados : ideone.com/fYXyh6 . Isso é permitido para o ios :: floatfield de acordo com o Thinking in C ++ vol 2, página 189, mas não diz o mesmo sobre o ios :: basefield.
Joel Sjögren
10

std::hex fornece a formatação hexadecimal, mas é uma opção com estado, o que significa que você precisa salvar e restaurar o estado ou isso afetará toda a saída futura.

Ingenuamente, retornar a isso std::decsó é bom se for onde as bandeiras estavam antes, o que pode não ser o caso, principalmente se você estiver escrevendo uma biblioteca.

#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

Isso combina a resposta e as informações de Greg Hewgill de outra pergunta .

jtpereyda
fonte
2

Use std::uppercasee std::hexpara formatar a variável inteira aa ser exibida no formato hexadecimal.

#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
fonte