如何通过cout将字符输出为整数?

xml*_*lmx 52 c++ io iostream outputstream type-conversion

#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;
}
Run Code Online (Sandbox Code Playgroud)

我预计输出如下:

ab
cd
ef
Run Code Online (Sandbox Code Playgroud)

然而,我一无所获.

我想这是因为cout总是将'char','signed char'和'unsigned char'视为字符而不是8位整数.但是,'char','signed char'和'unsigned char'都是完整的类型.

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

PS:static_cast(...)很难看,需要更多的工作来修剪额外的比特.

小智 97

char a = 0xab;
cout << +a; // promotes a to a type printable as a number, regardless of type.
Run Code Online (Sandbox Code Playgroud)

只要该类型为+普通语义提供一元运算符,这就可以工作.如果要定义一个表示数字的类,要为一元+运算符提供规范语义,请创建一个operator+()只返回*this值或引用到const.

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

  • 来到这里正是为了这个问题:正确地从模板化数字类型发出值。理想情况下,有一个更明确的运算符,例如“valueOf”或可能是流修饰符,但如果没有这些,一元加号适用于所有数字类型。关于这种语法的复杂性,这正是语言包含注释的原因,我强烈建议对此进行简短的注释。 (3认同)
  • 工作链接:http://www.cs.technion.ac.il/users/yechiel/c++-faq/print-char-or-ptr-as-number.html (2认同)
  • 这比较混乱。[sheu 的回答](/sf/answers/1025132181/) 中的简单`static_cast` 清楚地传达了意图。 (2认同)
  • 是的,它很晦涩,但在通用代码中非常有用。 (2认同)

she*_*heu 9

将它们转换为整数类型,(和bitmask适当!)即:

#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;
}
Run Code Online (Sandbox Code Playgroud)

  • 而`c1`和`c2`的输出是`ffffffab`和`ffffffcd`,它不是OP所期望的. (2认同)

小智 6

也许这个:

char c = 0xab;
std::cout << (int)c;
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你.