2015-12-01 128 views
15

这个问题来自我最近遇到的一个错误。我试图将一些整数值保存为十六进制文件。作为一个例子,这是我应该做的:cout << std :: ios :: hex做什么?

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功能设置std::ios_base::hex标志fmtflags

所以你的输出是这个标志的整数值(以十六进制表示,因为你以前发送过std::hex)。

6

std::hex是一个特殊的对象,当应用于使用operator<<流,

将流str的则baseField为十六进制,仿佛调用str.setf(std::ios_base::hex, std::ios_base::base field)

std::ios::hex(又名std::ios_base::hex)是传递给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)的成员,因此它也需要清除组中的任何其他标志。因此,用掩码(std::ios_base::basefield)调用setf()来清除任何其他可能设置的标志。

格式标志std::ios_base::fmtflags是一个位掩码类型。值std::ios_base::hex是其中的一个值。格式化时,你会得到一些数字,很可能是2的幂(然而,它不一定是2的幂)。您看到的值只是使用十六进制符号打印的0x800(即2048):设置任何格式化标志(width()除外)为粘性,即它们保持到标志未设置为止。如果你想看到的值2048(对于您所使用的执行),你会使用

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 

最后一行设置指出的整数值的前缀底部的标志showbase

  • 没有前缀=>小数
  • 领先0x =>十六进制
  • 领先0(但没有x)=>八进制
相关问题