68
#include <iostream>

using namespace std;

int main()
{  
    char          c1 = 0xab;
    signed char   c2 = 0xcd;
    unsigned char c3 = 0xef;

    cout << hex;
    cout << c1 << endl;
    cout << c2 << endl;
    cout << c3 << endl;
}

我预计输出如下:

ab
cd
ef

然而,我一无所获。

我猜这是因为 cout 总是将 'char'、'signed char' 和 'unsigned char' 视为字符而不是 8 位整数。但是,“char”、“signed char”和“unsigned char”都是整数类型。

所以我的问题是:如何通过 cout 将字符输出为整数?

PS: static_cast(...) 很丑陋,需要更多的工作来修剪额外的位。

4

6 回答 6

147
char a = 0xab;
cout << +a; // promotes a to a type printable as a number, regardless of type.

只要该类型提供+具有普通语义的一元运算符,它就可以工作。如果您要定义一个表示数字的类,要提供具有规范语义的一元 + 运算符,请创建一个简单地按值或通过引用到 constoperator+()返回的运算符。*this

来源:Parashift.com - 如何将字符打印为数字?如何打印 char* 以便输出显示指针的数值?

于 2015-02-09T16:42:46.093 回答
8

将它们转换为整数类型,(以及适当的位掩码!)即:

#include <iostream>

using namespace std;

int main()
{  
    char          c1 = 0xab;
    signed char   c2 = 0xcd;
    unsigned char c3 = 0xef;

    cout << hex;
    cout << (static_cast<int>(c1) & 0xFF) << endl;
    cout << (static_cast<int>(c2) & 0xFF) << endl;
    cout << (static_cast<unsigned int>(c3) & 0xFF) << endl;
}
于 2013-02-01T10:55:49.470 回答
7

也许是这样:

char c = 0xab;
std::cout << (int)c;

希望能帮助到你。

于 2013-02-01T10:59:12.420 回答
1

关于什么:

char c1 = 0xab;
std::cout << int{ c1 } << std::endl;

它简洁且安全,并产生与其他方法相同的机器代码。

于 2019-04-16T18:22:57.490 回答
1

另一种方法是重载<<运算符:

#include <iostream>

using namespace std;
typedef basic_ostream<char, char_traits<char>> basicOstream;

/*inline*/ basicOstream &operator<<(basicOstream &stream, char c) {
    return stream.operator<<(+c);
}
/*inline*/ basicOstream &operator<<(basicOstream &stream, signed char c) {
    return stream.operator<<(+c);
}
/*inline*/ basicOstream &operator<<(basicOstream &stream, unsigned char c) {
    return stream.operator<<(+c);
}

int main() {
    char          var1 = 10;
    signed char   var2 = 11;
    unsigned char var3 = 12;
    
    cout << var1 << endl;
    cout << var2 << endl;
    cout << var3 << endl;
    
    return 0;
}

打印以下输出:

10
11
12

Process finished with exit code 0

我认为它非常整洁和有用。希望它有帮助!


而且,如果你想让它打印一个hex值,你可以这样做:

basicOstream &operator<<(basicOstream &stream, char c) {
    return stream.operator<<(hex).operator<<(c);
} // and so on...
于 2021-06-15T12:43:02.940 回答
0

另一种方法是使用std::hex除了强制转换 (int)

std::cout << std::hex << (int)myVar << std::endl;

我希望它有所帮助。

于 2018-04-25T07:40:29.717 回答