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


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;

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

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

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


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;
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.