【问题标题】:What are some reasons you cast a char to an int in C++?在 C++ 中将 char 转换为 int 的一些原因是什么?
【发布时间】:2015-09-06 04:16:36
【问题描述】:

在 C++ 中将 char 转换为 int 的原因有哪些?

【问题讨论】:

  • 要找出它的 ASCII 值,对字符串进行修改,为加密目的加扰字符串,等等。
  • @NoobCoder:这些都不需要从char 转换为int

标签: casting char int


【解决方案1】:

char 值强制转换为int 几乎没有意义。

首先,一些术语。 cast 是一种显式转换,通过转换运算符指定,可以是 C 样式的 (type)expr 或 C++ 转换之一,例如 static_cast<type>(expr)隐式 转换不是强制转换。您有时会看到短语“隐式强制转换”,但在 C++(或 C)中没有这样的东西。

如果它们的操作数是比intunsigned int 窄的整数类型,则大多数算术运算符都会提升它们的操作数。例如,在表达式'0' + 1中,将0char值在相加前提升为int,结果为int类型。

如果您想将char 值分配给int 对象,只需分配它即可。该值是隐式转换的,就像使用强制转换一样。

在大多数情况下,隐式转换比强制转换更受欢迎,部分原因是它们不易出错。由语言规则指定的隐式转换通常会做正确的事情。

在某些情况下,您确实需要将 char 转换为 int。这是一个:

char c = 'A';
std::cout << "c = '" << c << "' = " << static_cast<int>(c) << "\n";

重载的&lt;&lt; 运算符接受charint(以及许多其他类型),因此没有隐式转换。如果没有演员表,相同的char 值将被使用两次。输出(假设是基于 ASCII 的字符集)是:

c = 'A' = 65

这是一个不寻常的情况,因为&lt;&lt; 运算符对charint 类型的处理非常不同。在大多数情况下,由于 char 已经是整数类型,所以使用 charint 值并不重要。

我能想到另一种非常模糊的可能性。 char几乎总是提升为 int。但是对于纯 char 未签名 并且 charint 的宽度相同的实现,纯 char 被提升为 unsigned int。这只有在CHAR_BIT &gt;= 16sizeof (int) == 1 时才会发生。您不太可能遇到这样的实现。即使在这样的系统上,char 是否提升为 intunsigned int 通常也无关紧要,因为任一提升都会产生正确的数值。

【讨论】:

    【解决方案2】:

    一般来说,这应该很少发生,因为何时使用 char 以及何时使用 int 相当明确。

    但是,如果您有兴趣对一组字符执行算术运算,则需要更多内存来存储整体值,因此您通常可以使用 int(或任何其他数据类型)来存储整体值.

    通过这样做,您更有可能将字符隐式转换为所选数据类型。

    但是,您也可以在计算之前或期间显式转换这些字符(不过后来的 C++ 版本会为您处理这些问题)。

    这是字符转换的一种更常见的用法。

    但在实践中,这通常可以避免,因为从长远来看,它会产生更清晰的代码

    【讨论】:

    • 附带说明,找出字母 (char my_letter) 在 alpabet 中位置的快速方法是 int(my_letter) - int('a') + 1(如果是小写字母)和 int(my_letter) - int('A')(如果是大写字母)。
    • @Ben:强制转换是不必要的,并且不保证可以正常工作(例如,它在基于 EBCDIC 的系统上失败)。
    • @KeithThompson:我应该提到这取决于字符编码。我对 C++ 所服务的大量不同机器的思考不够。不过我确实喜欢演员阵容;他们让我更清楚正在发生的事情。
    • @KeithThompson:我读了你的答案,这是有道理的,但我想举一个例子,说明隐式转换何时正确,而强制转换却没有。谢谢。
    • @Ben:很简单,当强制转换指定了错误的类型时。使用强制转换时,必须指定目标类型。这又是一次犯错的机会。当您更改变量的类型时很容易发生这种情况,但忘记更改分配给它的强制转换中的类型。
    猜你喜欢
    • 1970-01-01
    • 2014-02-07
    • 2013-08-10
    • 2018-02-10
    • 2010-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多