C ++ cout шестнадцатеричные значения?

144

Я хочу делать:

int a = 255; 
cout << a;

и он показывает FF на выходе, как бы я это сделал?

Кер
источник

Ответы:

201

Использование:

#include <iostream>

...

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

Есть много других опций для контроля точного форматирования выходного числа , таких как начальные нули и верхний / нижний регистр.

Грег Хьюгилл
источник
34
Кажется, это изменит весь будущий вывод с cout на hex; так что если вы хотите, чтобы «а» печаталось только в шестнадцатеричном виде, вы можете захотеть cout << hex << a << dec;изменить его обратно.
ShreevatsaR
16
@ShreevatsaR Одна проблема с восстановлением dec вместо hex состоит в том, что dec, возможно, не был ранее установленным значением, особенно если вы пишете универсальный метод библиотеки. На этот вопрос есть несколько ответов о том, как хранить и восстанавливать состояние. Вы можете сохранить состояние с помощью ios::fmtflags f(cout.flags());и восстановить его с помощью out.flags(f);.
Jtpereyda
Затем восстановите путемstd::cout.flags(f);
правдаадюстр
43

std::hexопределяется в <ios>который входит <iostream>. Но чтобы использовать такие вещи, как std::setprecision/std::setw/std::setfill/ etc, вы должны включить <iomanip>.

Benoît
источник
42

Чтобы манипулировать потоком для печати в шестнадцатеричном формате, используйте hexманипулятор:

cout << hex << a;

По умолчанию шестнадцатеричные символы выводятся в нижнем регистре. Чтобы изменить его на прописные, используйте uppercaseманипулятор:

cout << hex << uppercase << a;

Чтобы позже изменить вывод обратно в нижний регистр, используйте nouppercaseманипулятор:

cout << nouppercase << b;
Эшвин Нанджаппа
источник
2
Собирается ли nouppercaseизменить выход обратно на десятичную?
Cœur
Просто добавьте разное примечание, приведенный выше фрагмент не сделает ввод «яблоком», став «яблоком».
Правда от
20

Если вы хотите напечатать одно шестнадцатеричное число, а затем вернуться к десятичному числу, вы можете использовать это:

std::cout << std::hex << num << std::dec << std::endl;
Yoav
источник
13

Я понимаю, что это не то, о чем просил OP, но я все же думаю, что стоит указать, как это сделать с помощью printf. Я почти всегда предпочитаю использовать его вместо std :: cout (даже без предыдущего C-фона).

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

«2» определяет точность, «X» или «x» определяет регистр.

Дэниел Слооф
источник
4
Там давно была битва принф против кута. Конечно, у cout есть приятное свойство, которое он получает из ostream и получает все преимущества абстракции. В C нет понятия потоковых объектов, поэтому printf и fprintf - это две разные команды. Действительно, было бы неплохо в C, если бы stdout был ФАЙЛОМ *. Сделал бы все проще.
rlbond
11
@rlbond stdout - это ФАЙЛ * в C.
Этьен
4
Вот почему printf("hello\n")эквивалентно fprintf(stdout, "hello\n"). Более полезно, вы можете передать stdout(или stdin, или stderr) функцию, которая принимает FILE*аргумент.
Кит Томпсон
11

Существуют различные виды флагов и масок, которые вы также можете использовать. Пожалуйста, обратитесь к http://www.cplusplus.com/reference/iostream/ios_base/setf/ для получения дополнительной информации.

#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
источник
5
Я думаю, что поведение этого кода не определено. Setf очищает биты ios :: basefield, включая ios :: dec (по умолчанию для стандартных потоков), и устанавливает только ios :: hex. Когда ios :: hex не установлен, каждый бит в ios :: basefield не установлен. Как это печатается во второй раз? доказательства того, что все биты не установлены: ideone.com/fYXyh6 . Это разрешено для ios :: floatfield в соответствии с Thinking in C ++ vol 2 page 189, но это не говорит о ios :: basefield.
Джоэл Сьёгрен
10

std::hex возвращает вам шестнадцатеричное форматирование, но это опция с сохранением состояния, то есть вам нужно сохранять и восстанавливать состояние, иначе это повлияет на весь последующий вывод.

Наивное переключение обратно std::decхорошо только тогда, когда флаги были там, что может быть не так, особенно если вы пишете библиотеку.

#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

Это объединяет ответ Грега Хьюджилла и информацию из другого вопроса .

jtpereyda
источник
2

Используйте std::uppercaseи std::hexдля форматирования целочисленной переменной aдля отображения в шестнадцатеричном формате.

#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
источник