1

私は3つのプログラムを持っています。programA のコードを以下に示します。

#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <locale>
using namespace std;
int _tmain( void )
{
    wstringstream s2;    
    TCHAR waTemp2[4] = {0xA0, 0xA1, 0x00A2, 0xA3};
    for (int i = 0; i < 4; i++)
    {
    s2<< hex <<(unsigned int)waTemp2[i] << " ";  
    }
    wstring strData2 =  s2.str();
    wcout << strData2.c_str() <<endl; 
    return 0;
}

出力は次のとおりです。

a0 a1 a2 a3

programB のコードを以下に示します。

#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <locale>
using namespace std;
int _tmain( void )
{
    wstringstream s2;    
    TCHAR waTemp2[4] = {0xA0, 0xA1, 0x00A2, 0xA3};
    for (int i = 0; i < 4; i++)
    {
    s2<< hex << waTemp2[i] << " ";  
    }
    wstring strData2 =  s2.str();
    wcout << strData2.c_str() <<endl; 
    return 0;
}

出力は次のとおりです。

????

programC のコードを以下に示します。

#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <locale>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
    wstringstream s2;    
    TCHAR waTemp2[4] = {0xA0, 0xA1, 0x00A2, 0xA3};
    for (int i = 0; i < 4; i++)
    {
    s2 << std::wios::hex <<(unsigned int)waTemp2[i] << " "; 
    }
    wstring strData2 =  s2.str();
    wcout<< strData2.c_str() <<endl;
    return 0;
}

出力は次のとおりです。

2048160 2048161 2048162 2048163

std::wios::hex と std::hex、std::hex << waTemp2[i] と std::hex << (unsigned int)waTemp2[i] の違いの理由を教えてください出力の。

どうもありがとうございます!

4

1 に答える 1

1

std::hexマニピュレーターです。整数を渡すと、ストリームが 16 進数を出力するように設定されます。これは、ストリームでの呼び出しと同等setf(std::wios::hex, std::wios::basefield);です (ワイド ストリームを想定)。たとえば、コードを次のように変更してみてください。同じ結果が表示されるはずです。

wchar_t waTemp2[4] = {0xA0, 0xA1, 0x00A2, 0xA3};
s2.setf(std::wios::hex, std::wios::basefield);
for (int i = 0; i < 4; i++)
{
    s2 << (unsigned)waTemp2[i] << " ";  
}

std::wios::hexビットマスク フラグとして使用される定数です。ストリームを設定するマニピュレータと混同しないでください。たとえば、coliru では次のように表示されます8

std::cout << std::wios::hex;

これは、ストリームのフォーマット フラグを更新するためのビットマスクとして使用されます。次のように定義されます (ここで libstdc++ の実際の定義を参照してください)。

enum fmtflags
{
   _hex = 1L << 3,
};

class ios_base
{
    static const fmtflags hex = _hex;
};

あなたが見ている理由は、と2048160 2048161 2048162 2048163の数を出力しているだけです。間にスペースを追加して表示std::wios::hex(unsigned int)waTemp2[i]s2 << std::wios::hex << " " << (unsigned int)waTemp2[i] << " ";

の問題s2 << hex << waTemp2[i] << " ";std::hex、整数に対してのみ使用されます。wchar_tは整数ではないため、対応する文字を出力するだけです。

于 2013-07-03T04:39:51.600 に答える