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

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

int a = 255; 
cout << a;

и должен ли он отображать FF на выходе, как мне это сделать?


person Community    schedule 26.01.2009    source источник


Ответы (10)


Использовать:

#include <iostream>

...

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

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

person Greg Hewgill    schedule 26.01.2009
comment
Похоже, это изменит весь будущий вывод с cout на шестнадцатеричный; поэтому, если вы хотите, чтобы в шестнадцатеричном формате выводилось только «a», вы можете захотеть что-то вроде cout << hex << a << dec;, чтобы вернуть его обратно. - person ShreevatsaR; 09.03.2012
comment
@ShreevatsaR Одна из проблем с восстановлением dec по шестнадцатеричному формату заключается в том, что dec могло не соответствовать ранее установленному значению, особенно если вы пишете универсальный библиотечный метод. В этом вопросе есть несколько ответов о том, как сохранять и восстанавливать состояние. Вы можете сохранить состояние с помощью ios::fmtflags f(cout.flags()); и восстановить его с помощью out.flags(f);. - person jtpereyda; 08.01.2015
comment
Затем восстановите с помощью std::cout.flags(f); - person eigenfield; 14.03.2020

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

person Benoît    schedule 26.01.2009

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

cout << hex << a;

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

cout << hex << uppercase << a;

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

cout << nouppercase << b;
person Ashwin Nanjappa    schedule 05.03.2009
comment
nouppercase изменит вывод обратно на десятичный? - person Cœur; 01.02.2019
comment
Просто чтобы добавить разное примечание, приведенный выше фрагмент не сделает входное яблоко APPLE. - person eigenfield; 14.03.2020

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

std::cout << std::hex << num << std::dec << std::endl;
person Yoav    schedule 17.01.2015

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

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

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

person Daniel Sloof    schedule 05.03.2009
comment
Давно идет битва между printf и cout. Конечно, cout имеет приятное свойство, которое он унаследовал от ostream, и получает все преимущества абстракции. В C нет концепции потоковых объектов, поэтому printf и fprintf - это две разные команды. В самом деле, было бы неплохо в C, если бы stdout был ФАЙЛОМ *. Сделал бы дело проще. - person rlbond; 13.05.2009
comment
@rlbond stdout - это ФАЙЛ * в C. - person Étienne; 11.02.2014
comment
Вот почему printf("hello\n") эквивалентно fprintf(stdout, "hello\n"). Более полезно, вы можете передать stdout (или stdin, или stderr) функции, которая принимает аргумент FILE*. - person Keith Thompson; 04.02.2016

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

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

person jtpereyda    schedule 01.02.2019

Вы также можете использовать разные типы флагов и масок. См. 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;
}
person Gaurav    schedule 22.04.2012
comment
Я думаю, что поведение этого кода не определено. Setf очищает биты ios :: basefield, включая ios :: dec (по умолчанию для стандартных потоков), и устанавливает только ios :: hex. Когда ios :: hex не установлен, каждый бит в ios :: basefield не установлен. Как его номер напечатали второй раз? свидетельство того, что все биты не установлены: ideone.com/fYXyh6. Это разрешено для ios :: floatfield в соответствии с «Мышлением в C ++, том 2, стр. 189», но этого не говорится о ios :: basefield. - person Joel Sjögren; 21.07.2013

Используйте 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;
}
person Community    schedule 06.04.2020

C ++ 20 std::format

На мой взгляд, сейчас это самый чистый метод, так как он не загрязняет std::cout состояние std::hex:

main.cpp

#include <format>
#include <string>

int main() {
    std::cout << std::format("{:x} {:#x} {}\n", 16, 17, 18);
}

Ожидаемый результат:

10 0x11 18

Еще не реализовано в GCC 10.0.1, Ubuntu 20.04.

Но потрясающая библиотека, которая стала C ++ 20 и должна быть такой же, после установки работала с:

git clone https://github.com/fmtlib/fmt
cd fmt
git checkout 061e364b25b5e5ca7cf50dd25282892922375ddc
mkdir build
cmake ..
sudo make install

main2.cpp

#include <fmt/core.h>
#include <iostream>

int main() {
    std::cout << fmt::format("{:x} {:#x} {}\n", 16, 17, 18);
}

Скомпилируйте и запустите:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main2.out main2.cpp -lfmt
./main2.out

Документировано по адресу:

Дополнительная информация: std :: string форматирование, например sprintf

До C ++ 20: аккуратная печать и восстановление std::cout в предыдущее состояние

main.cpp

#include <iostream>
#include <string>

int main() {
    std::ios oldState(nullptr);
    oldState.copyfmt(std::cout);
    std::cout << std::hex;
    std::cout << 16 << std::endl;
    std::cout.copyfmt(oldState);
    std::cout << 17 << std::endl;
}

Скомпилируйте и запустите:

g++ -ggdb3 -O0 -std=c++11 -Wall -Wextra -pedantic -o main.out main.cpp
./main.out

Вывод:

10
17

Подробнее: Восстановить состояние std :: cout после манипулировать им

Проверено на GCC 10.0.1, Ubuntu 20.04.

person Ciro Santilli 新疆再教育营六四事件ۍ    schedule 24.09.2020
comment
Если кому-то интересно, вы можете проверить статус поддержки стандартной библиотеки на en.cppreference.com/w / cpp / compiler_support. Эта функция отображается как форматирование текста. - person Tyler Kropp; 13.01.2021

Как дела!

#include <iostream>
#include <iomanip>

unsigned char buf0[] = {4, 85, 250, 206};
for (int i = 0;i < sizeof buf0 / sizeof buf0[0]; i++) {
    std::cout << std::setfill('0') 
              << std::setw(2) 
              << std::uppercase 
              << std::hex << (0xFF & buf0[i]) << " ";
}
person eigenfield    schedule 22.12.2020