Не могли бы вы объяснить причины вывода при использовании std::hex и std::wios::hex в C++

У меня есть три программы. код программы A показан ниже:

#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

код программы B показан ниже:

#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;
}

вот вывод:

????

код программы C показан ниже:

#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] привела к разным выход.

Большое спасибо!

1 ответ

std::hex это манипулятор. Он устанавливает поток для вывода hex, когда вы передаете целое число. Это эквивалентно звонку 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 постоянное число, используемое в качестве флага битовой маски. Не путайте его с манипулятором, который устанавливает поток. На колиру например следующие отпечатки 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 не является целым числом, он просто печатает соответствующий символ.

Другие вопросы по тегам