Я хочу сделать:
int a = 255;
cout << a;
и должен ли он отображать FF на выходе, как мне это сделать?
Я хочу сделать:
int a = 255;
cout << a;
и должен ли он отображать FF на выходе, как мне это сделать?
Использовать:
#include <iostream>
...
std::cout << std::hex << a;
Существует множество других параметров для управления точным форматированием выходного числа, например ведущие нули и верхний / нижний регистр.
cout << hex << a << dec;
, чтобы вернуть его обратно.
- person ShreevatsaR; 09.03.2012
ios::fmtflags f(cout.flags());
и восстановить его с помощью out.flags(f);
.
- person jtpereyda; 08.01.2015
std::cout.flags(f);
- person eigenfield; 14.03.2020
std::hex
определен в <ios>
, который включен <iostream>
. Но чтобы использовать такие вещи, как std::setprecision/std::setw/std::setfill
/ и т. Д., Вы должны включить <iomanip>
.
Чтобы управлять потоком для печати в шестнадцатеричном формате, используйте манипулятор hex
:
cout << hex << a;
По умолчанию шестнадцатеричные символы выводятся в нижнем регистре. Чтобы изменить его на верхний регистр, используйте манипулятор uppercase
:
cout << hex << uppercase << a;
Чтобы позже изменить вывод обратно на нижний регистр, используйте манипулятор nouppercase
:
cout << nouppercase << b;
nouppercase
изменит вывод обратно на десятичный?
- person Cœur; 01.02.2019
Если вы хотите напечатать одно шестнадцатеричное число, а затем вернуться к десятичным, вы можете использовать это:
std::cout << std::hex << num << std::dec << std::endl;
Я понимаю, что это не то, о чем просил OP, но я все же считаю, что стоит указать, как это сделать с помощью printf. Я почти всегда предпочитаю использовать его вместо std :: cout (даже без предыдущего фона C).
printf("%.2X", a);
«2» определяет точность, «X» или «x» определяет регистр.
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
Это объединяет ответ Грега Хьюджилла и информацию из другого вопроса.
Вы также можете использовать разные типы флагов и масок. См. 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;
}
Используйте 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;
}
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.
Как дела!
#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]) << " ";
}