Шістнадцяткові значення C ++?


144

Я хочу зробити:

int a = 255; 
cout << a;

і як це показати FF у висновку, як би я це зробив?

Відповіді:


201

Використання:

#include <iostream>

...

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

Існує безліч інших варіантів керування точним форматуванням вихідного числа , наприклад, ведучі нулі та верхній / нижній регістр.


34
Це, здається, змінить весь майбутній вихід з cout в hex; тому, якщо ви хочете, щоб друк "a" був надрукований у шістнадцятковій формі, ви можете хотіти щось, як cout << hex << a << dec;змінити його назад.
ShreevatsaR

16
@ShreevatsaR Однією із проблем відновлення dec через шістнадцяткову є те, що dec, можливо, не було раніше встановленим значенням, особливо якщо ви пишете загальний метод бібліотеки. Це запитання містить кілька відповідей про збереження та відновлення стану. Ви можете зберегти стан за допомогою ios::fmtflags f(cout.flags());та відновити його out.flags(f);.
jtpereyda

Потім відновітьstd::cout.flags(f);
truthadjustr

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

Просто для додання іншої примітки, наведений вище фрагмент не зробить вхідне "яблуко" перетворенням "APPLE".
truthadjustr

20

Якщо ви хочете надрукувати один шістнадцятковий номер, а потім повернутись до десяткової, ви можете скористатися цим:

std::cout << std::hex << num << std::dec << std::endl;

13

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

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

'2' визначає точність, 'X' або 'x' визначає випадок.


4
Вже давно існує битва printf vs cout. Звичайно, 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
Я думаю, що поведінка цього коду не визначена. Набір очищає біти ios :: basefield, включаючи ios :: dec (за замовчуванням для стандартних потоків), і встановлює тільки ios :: hex. Коли ios :: hex не встановлено, кожен біт у ios :: basefield не встановлений. Як це число друкували вдруге? доказ того, що біти все не встановлено: ideone.com/fYXyh6 . Це дозволено для ios :: floatfield згідно з думкою C ++ vol 2, сторінка 189, але це не говорить те ж саме про ios :: basefield.
Joel Sjögren

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.