1

我有三个程序。程序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] 之间的差异导致不同的原因吗的输出。

非常感谢!

4

1 回答 1

1

std::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是用作位掩码标志的常数。不要将它与设置流的操纵器混淆。例如在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] << " ";is的问题std::hex仅用于整数。由于wchar_t不是整数,它只打印相应的字符。

于 2013-07-03T04:39:51.600 回答