如何输出一个字符作为一个整数通过 cout?

#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”、“有符号 char”和“无符号 char”视为字符,而不是8位整数。但是,“ char”、“有符号 char”和“无符号 char”都是整数类型。

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

Static _ cast (...)很丑陋,需要更多的工作来修剪额外的位。

87852 次浏览

将它们强制转换为整数类型(并适当地使用位掩码!) ,例如:

#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;
}

也许是这样:

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

希望能有帮助。

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

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

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

另一种方法是使用除 铸造(int)以外的 十六:

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

希望能有所帮助。

那么:

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

它简洁、安全,而且 生产的机器码和其他方法一样。

另一种方法是使 <<操作符超载:

#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...