将字符显示为没有显式强制转换的整数

Displaying chars as ints without explicit cast

本文关键字:转换 整数 显示 字符      更新时间:2023-10-16

每次我向 cout 对象发送字符时,它都会以 ASCII 字符显示,除非我将其转换为 int。

问:有没有办法在没有显式强制转换的情况下显示字符的数值?

我在某处读到,在您的代码中进行过多的转换可能会导致(您的程序)完整性的丧失。我猜测字符出于特定原因以 ASCII 显示,但我不确定为什么。

我本质上是在创造一款游戏。我正在使用计划向控制台显示的小数字(无符号字符)。我可能是偏执狂,但每当我在代码中到处发送垃圾邮件static_cast<int>时,我都会感到不安。

不过,类型转换没有错,特别是如果你使用static_cast来做到这一点。 这就是你应该使用的。 它允许编译器验证类型转换并确保它是安全的。

要更改 << 运算符的行为,您必须覆盖char值的默认<<运算符,例如:

std::ostream& operator <<(std::ostream &os, char c)
{
    os << static_cast<int>(c);
    return os;
}
char c = ...;
std::cout << c;

您可以创建一个将char作为输入的自定义类型,然后实现该类型的<<运算符,例如:

struct CharToInt
{
    int val;
    CharToInt(char c) : val(static_cast<int>(c)) {}
};
std::ostream& operator <<(std::ostream &os, const CharToInt &c)
{
    os << c.val;
    return os;
}
char c = ...;
std::cout << CharToInt(c);

您可以创建一个执行类似操作的函数,然后不必覆盖<<运算符,例如:

int CharToInt(char c)
{
    return c;
}
char c = ...;
std::cout << CharToInt(c);

随着事情的发展,这是对强制转换的合理使用,但是是的,它可以改进。 所涉及的"完整性损失"只是,如果其中一个数据类型从 char 更改为双精度,则强制转换将继续编译,但可能不会执行您想要的操作。 您可以改为创建帮助程序函数:

inline int to_int(char c) { return static_cast<int>(c); }

与static_cast不同,这只会在原始类型char时启动,因此,如果您更改为类似double的内容,您将收到编译器警告 - 实际上是提醒您检查代码。