当前位置:  开发笔记 > 编程语言 > 正文

cout << std :: ios :: hex有什么作用?

如何解决《cout<<std::ios::hex有什么作用?》经验,为你挑选了3个好方法。

这个问题来自我最近遇到的一个错误.我试图将一些整数值保存为文件为十六进制.举个例子,这就是我应该做的:

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

但是错误的是,我将它用作以下内容:

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

编译器没有抱怨,但显然结果不正确.我随机尝试了几个值,似乎(2)实际上给出了部分正确的结果,除了它附加800作为前缀.我不明白800来自哪里,我在任何地方都看不到好的参考.任何人都能解释一下发生在幕后的事情吗?

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

M.M.. 17

这实际上是std::ios_base::hex.它是一个实现定义的位掩码.在内部,流有一个整数fmtflags,在其中存储格式的当前状态.

在您的实现中,hex是标志0x800.其他标志将指示它是否处于科学记数法模式,是否boolalpha打开等.等.

std::hex函数设置std::ios_base::hex标志fmtflags.

所以你的输出是这个标志的整数值(自你std::hex之前发送以十六进制).



1> M.M..:

这实际上是std::ios_base::hex.它是一个实现定义的位掩码.在内部,流有一个整数fmtflags,在其中存储格式的当前状态.

在您的实现中,hex是标志0x800.其他标志将指示它是否处于科学记数法模式,是否boolalpha打开等.等.

std::hex函数设置std::ios_base::hex标志fmtflags.

所以你的输出是这个标志的整数值(自你std::hex之前发送以十六进制).



2> Dietmar Kühl..:

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()使用mask(std::ios_base::basefield)调用以清除任何其他可能设置的标志.

格式标志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)=>八进制



3> Tristan Brin..:

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

将流的基本域设置str为十六进制,就像通过调用一样str.setf(std::ios_base::hex, std::ios_base::base field)

std::ios::hex(又名std::ios_base::hex)是传递给setf方法的实际位掩码值.它的值是实现定义的,它似乎0x800在你的情况下.

推荐阅读
依然-狠幸福
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有