将字符显示为int而不显式强制转换

时间:2012-06-28 00:54:10

标签: c++ casting char cout

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

问:有没有办法在没有明确演员的情况下显示char的数值?

我在某处读到过在代码中执行太多强制转换会导致(程序的)完整性丢失。我猜这些字符以特殊原因显示在ASCII中,但我不确定原因。

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

2 个答案:

答案 0 :(得分:5)

但是,类型转换没有任何问题,特别是如果您使用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);

答案 1 :(得分:0)

随着时间的推移,这是合理使用演员,但是可以改进。所涉及的“完整性的丧失”就是如果其中一个数据类型从char更改为双倍,则演员将继续编译但可能不会执行您想要的操作。您可以改为创建辅助函数:

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

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