C++ cout 十六进制格式输出

19

我是一名C语言程序员,对C++还不太熟悉。

我尝试使用cout输出以下内容,但输出结果很奇怪。欢迎给出任何关于此行为的评论。

#include<iostream>
using namespace std;

int main()
{
        unsigned char x = 0xff;

        cout << "Value of x  " << hex<<x<<"  hexadecimal"<<endl;

        printf(" Value of x %x by printf", x);
}

输出:

 Value of x  ÿ  hexadecimal
 Value of x ff by printf
3个回答

28

<<char 视为您要输出的“字符”,并精确输出该字节。而 hex 仅适用于整数类型,因此以下内容将产生预期效果:

cout << "Value of x  " << hex << int(x) << "  hexadecimal" << endl;

Billy ONeal的建议,使用static_cast,看起来像这样:

cout << "Value of x  " << hex << static_cast<int>(x) << "  hexadecimal" << endl;

非常感谢您的回复,对我很有帮助。所以"<<hex"不等同于printf("%x", x),在这种情况下,该位置处的位流被视为十六进制值吗? - pdk
3
这段话的意思是:这个代码行的本意是相同的,但只有当 cout << x 想要输出十进制表示时才会生效。因为 cout << (a char) 不会输出十进制表示(它会直接输出那个字节),所以 hex 没有意义,也不起作用。因此,我们强制将其转换为 int 类型,然后调用处理 int 类型的 <<,从而输出十六进制表示。 - Thanatos
好的,非常感谢您的评论,对我来说确实很有帮助。 所以总结一下,据我所理解,在这种情况下发生了无符号字符重载。而 << hex 被忽略,导致输出为字符格式。 - pdk

5

您的十六进制部分是正确的,但是x是一个字符,C++试图将其作为字符打印。您需要将其强制转换为整数。

#include<iostream>
using namespace std;

int main()
{
        unsigned char x = 0xff;

        cout << "Value of x  " << hex<<static_cast<int>(x)<<"  hexadecimal"<<endl;

        printf(" Value of x %x by printf", x);
}

非常感谢,Starkey。那么为什么printf可以正确地打印字符的十六进制值呢?对于这个基本问题我很抱歉... - pdk
2
在printf中,通过指定%x,你告诉C ++如何解释x,而使用hex << x时,编译器将使用无符号字符重载的流操作符,因为这是该类型。通过将x的类型更改为int,将应用int重载的<<。 - StuartLC
@cletus:C++ 也有 printf。话虽如此,这两个函数的策略完全不同。我发现 cout 在日常使用中更直观,但一旦你想要输出进行花式格式化时,与 printf 相比会变得痛苦。 - Brian

1
如果我理解您的问题正确,您应该知道如何将hex转换为dec,因为您已经分配了unsigned char x = 0xff;
#include <iostream>
int main()
{
    unsigned char x = 0xff;
    std::cout << std::dec << static_cast<int>(x) << std::endl;
}

这将返回值为255

有关将str流转换为dec的详细信息,请参见http://www.cplusplus.com/reference/ios/dec/

如果您想从十进制数中了解十六进制值,这里有一个简单的示例。

#include <iostream>
#include <iomanip>

int main()
{
    int x = 255;

    std::cout << std::showbase << std::setw(4) << std::hex << x << std::endl;
}

这段代码会打印出oxff

如果你想在ff前面看到0x,则需要使用可选的<iomanip>库。有关打印hex数字的原始回复可以在http://www.cplusplus.com/forum/windows/51591/中找到。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接