C ++ cout 16進値?


144

私はやってみたいです:

int a = 255; 
cout << a;

出力にFFと表示されますが、どうすればよいですか?

回答:


201

使用する:

#include <iostream>

...

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

先行ゼロや大文字/小文字など、出力番号の正確なフォーマットを制御する他の多くのオプションがあります


34
これにより、将来のすべての出力がcoutから16進数に変更されるようです。したがって、「a」だけを16進数で出力したい場合はcout << hex << a << dec;、元に戻すなどの変更が必要な場合があります。
ShreevatsaR 2012年

16
@ShreevatsaR 16進数でdecを復元する際の1つの問題は、特に汎用ライブラリメソッドを作成している場合は、decが以前に設定されていなかった可能性があることです。この質問には、状態を保存および復元する方法に関するいくつかの回答があります。で状態を保存しios::fmtflags f(cout.flags());、で復元できますout.flags(f);
jtpereyda 2015年

次に、次の方法で復元しますstd::cout.flags(f);
TruthAdjuster

43

std::hexで定義され<ios>ているはに含まれてい<iostream>ます。ただし、std::setprecision/std::setw/std::setfill/ etcなどを使用するには、を含める必要があります<iomanip>


42

ストリームを操作して16進数で出力するには、hexマニピュレーターを使用します。

cout << hex << a;

デフォルトでは、16進文字は小文字で出力されます。大文字に変更するには、uppercaseマニピュレータを使用します。

cout << hex << uppercase << a;

後で出力を小文字に戻すには、nouppercaseマニピュレーターを使用します。

cout << nouppercase << b;

2
されてnouppercase戻って小数への出力を変更するつもり?
・クール

雑多な注記を追加するために、上記のスニペットは入力「apple」が「APPLE」になることはありません。
真理調整者

20

1つの16進数を出力してから10進数に戻す場合は、次のように使用できます。

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

12

これはOPが要求するものではないことを理解していますが、printfでそれを行う方法を指摘することは価値があると私はまだ思います。ほとんどの場合、std :: cout(以前のCバックグラウンドがない場合でも)よりも使用することを好みます。

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

「2」は精度を定義し、「X」または「x」は大文字と小文字を定義します。


4
printf対coutの戦いが長い間あります。もちろん、coutにはostreamから派生した優れた特性があり、すべての抽象化の利点を得ます。Cにはストリームオブジェクトの概念がないため、printfとfprintfは2つの異なるコマンドです。本当に、stdoutがFILE *だったら、Cで良かったでしょう。物事を簡単にしたでしょう。
rlbond 2009年

10
@rlbond stdoutがC.でFILE *である
エティエンヌ

3
どちらの理由である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 :: dec(標準ストリームのデフォルト)を含むios :: basefieldビットをクリアし、ios :: hexのみを設定します。ios :: hexが設定されていない場合、ios :: basefieldのすべてのビットが設定解除されます。2回目にはどのように印刷されましたか?ビットがすべて未設定であることの証拠:ideone.com/fYXyh6。これはios :: floatfieldではC ++ vol 2のThinking 189ページに従って許可されていますが、ios :: basefieldについて同じとは言えません。
JoelSjögren2013

10

std::hex 16進フォーマットを取得しますが、これはステートフルオプションです。つまり、状態を保存して復元する必要があります。そうしないと、将来のすべての出力に影響します。

単純に元に戻す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

これは、Greg Hewgillの回答と別の質問の情報を組み合わせたものです。


2

std::uppercaseおよびstd::hexを使用してa、16進形式で表示される整数変数をフォーマットします。

#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;
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.