2015-12-01 33 views
15

この質問は私が最近入ったバグから来ています。私は16進数としてファイルにいくつかの整数値を保存しようとしていた。例として、これは私が何をすべきかです:cout << std :: ios :: hex doとは何ですか?

cout << std::hex << value << endl;     // (1) 

しかし誤って、私は次のようにそれを使用する:

cout << std::ios::hex << value << endl;   // (2) 

コンパイラは文句はありませんが、明らかに結果が正しくありません。ランダムに2つ以上の値を試していましたが、実際には部分的に正しい結果が得られますが、という接頭辞が付いているようです。私はがどこから来ているのか分かりません。どこにでも良い参考文献はありません。フードの下で何が起きているのか誰でも説明できますか?

cout << std::hex << 255 << endl;  // output: FF 
cout << std::ios::hex << 255 << endl; // output: 800ff 

cout << std::hex << 135 << endl;  // output: 87 
cout << std::ios::hex << 135 << endl; // output: 80087 

cout << std::hex << 11 << endl;  // output: b 
cout << std::ios::hex << 11 << endl; // output: 800b 

答えて

17

これは実際にはstd::ios_base::hexです。実装定義のビットマスクです。内部的には、ストリームにはfmtflagsという整数があり、フォーマットの現在の状態が格納されます。

hexの実装では、フラグ0x800です。他のフラグはboolalphaは、等等

std::hex機能がfmtflagsstd::ios_base::hexフラグをセットにあるかどうか、それが科学的表記モードですかどうかを示すであろう。

出力はこのフラグの整数値です(前にstd::hexを送信したので、16進数で表示されます)。

6

std::hex

str.setf(std::ios_base::hex, std::ios_base::base field)

std::ios::hex(別名std::ios_base::hex)を呼び出しているかのようにヘクスするストリームstrのbaseFieldのを設定し、operator<<を使用してストリームに適用される場合、その特別な目的でありますsetfメソッドに渡される実際のビットマスク値です。その値は実装定義されており、あなたのケースでは0x800と思われます。

10

std::hexマニピュレータである、すなわち、それは特定のシグネチャを持つ関数である:

std::ios_base& hex(std::ios_base& stream) { 
    stream.setf(std::ios_base::hex, std::ios_base::basefield); 
    return stream; 
} 

マニピュレータを処理するストリーム用に定義されたいくつかの特別な出力演算子があります。 std::ios_baseへの参照で動作するバージョンのために(操作者が実際に関数テンプレートであることを無視して)がある。

std::ostream& operator<< (std::ostream& out, std::ios_base&(*manip)(std::ios_base&)); 

ストリームで使用する場合、マニピュレータ関数が呼び出されると、それは特定のフォーマットフラグを設定し、中この場合std::ios_base::hex(これは実際にはstd::ios::hexの定義方法です)。 std::ios_base::hexはフラグのグループ(他はstd::ios_base::decstd::ios_base::oct)のメンバーであるため、グループ内の他の可能性のあるフラグもクリアする必要があります。したがって、setf()はマスク(std::ios_base::basefield)で呼び出され、他の潜在的に設定されたフラグをクリアします。

フォーマットフラグstd::ios_base::fmtflagsはビットマスクタイプです。値std::ios_base::hexが値の1つです。書式設定するときには、いくつかの数字が得られます。ほとんどの場合、2の累乗になります(ただし、2の累乗である必要はありません)。表示される値は、0x800(つまり2048)です。フォーマットフラグ(width()以外)のいずれかをスティッキーに設定すると、フラグが設定されていない限り残ります。

    :あなたは(あなたが使用している実装のための)値2048を見たい場合は、最後の行は、接頭辞を持つ整数値のベースを示すフラグ showbaseをセット

    std::cout << std::dec << std::ios_base::hex << "\n";  // 2048 
    std::cout << std::hex << std::ios_base::hex << "\n";  // 800 
    std::cout << std::showbase << std::ios_base::hex << "\n"; // 0x800 
    

    を使用したいです

  • ない接頭辞=>小数点
  • 主要0x =>進
  • 主要0(ただしx)=>進
関連する問題