【问题标题】:Why can a compiler convert char to int in C++?为什么编译器可以在 C++ 中将 char 转换为 int?
【发布时间】:2016-01-21 21:38:58
【问题描述】:

通过 Java 和现在的 C++ 编程,我发现您可以将 char 转换为 int,然后将 int 转换为 double

我想知道为什么char 可以转换为int

在 C++ 中,它们分配的内存量不同,char 是 8 位,int 是 32 位。那么这是如何工作的呢?

编译器就是这样设置的吗?我只是想要一个解释。

感谢您的任何帮助!

【问题讨论】:

  • 这就像在问如何将 8 升水倒入一个容积为 32 升的桶中。
  • 您是在问为什么语言是这样定义的,或者在标准中的什么地方说可以将char 转换为int
  • 简答:因为标准允许这样做

标签: c++ char int


【解决方案1】:

在某些架构上,char 可以保存的每个值,int 也可以保存。所以如果你有一个char,你可以用它来初始化一个int,方法是给int一个与char相同的值。这应该不足为奇。

在其他架构上,这不是真的。仍然 C++ 允许将任何整数类型转换为任何其他整数类型。这一定是正确的,因为它在 C 中也是允许的,但是您可以使用大括号初始化来防止这种“缩小”转换。

我认为您所关心的 --- 这应该是 any 架构的一个问题 --- 是采用 char 并将其“传递”为 int。但这不是将char 转换为int 所做的事情。 使用reinterpret_cast 转换为int& 会做什么;这种转换是危险的,并可能引发未定义的行为;不仅因为intchar 的大小不同,还因为即使它们的大小相同,它们也可能没有相同的表示。

【讨论】:

  • 关于“char 可以容纳的每个值,int 也可以容纳”,不。例如,CHAR_BIT = 16、16 位 int 和无符号 char
  • 糟糕,我忘了char 可以不签名。我会编辑。
【解决方案2】:

冻结历史。 C++ 是基于 C 的,并且几乎仍然将 C 作为适当的子集。而在 1970 年代,当 C 语言被开发时,bytecharacter 之间并没有太大区别:几乎所有(如果不是绝对全部)主要文本编码都使用每个字符一个字节。

在现代 C++ 中,char 及其两个变体unsigned charsigned char 只是基本的字节类型,其中一个字节被定义为内存的最小可寻址单元,而当用于字符时,char 只是基本编码单元(例如,对于 UTF-8,character 由 1 到 5 个字节组成,我认为是字节)。

自 1998 年标准化以来,C++ 已经获得了三种更有目的的字符类型:wchar_tchar16_tchar32_t,但遗憾的是没有强类型这样的类型。


编译器选项或设置不影响是否 char 隐式转换为整数,但它们会影响普通char 是有符号还是无符号类型。通常它是签名的,也是出于历史原因,这是不切实际的。作为签名类型,它仍然不同于 signed char,例如关于函数调用的重载决议,作为无符号类型,它不同于unsigned char


您可以使用enum 定义强类型字节大小字符编码值类型:

using Byte = unsigned char;
enum class Byte_char : Byte  {};

“强类型”意味着它不会隐式转换为数字。

但是,我更喜欢更轻松的类型检查

enum Byte_char : Byte  {};

转换为 整数,但它是一种不同于 Byte 用于其他目的的类型(这并不意味着我使用 Byte_char 类型,这只是我发现的在定义这种类型时很实用)。

就大小而言,这种类型实际上也可以定义为struct,因为据我所知,没有现存的C++ 编译器在单个字节struct 中插入填充。但是,这样的定义可能与std::basic_string 的“短缓冲区优化”不兼容。 enum 与该优化配合得很好。

【讨论】:

    【解决方案3】:

    根据 C++ 标准,数值类型之间的提升是合法的。也就是说,这个特性是 C++ 语言的一部分。

    特别是对于您所指的促销活动,char 可以提升为 intint 可以提升为 double,而不会损失精度,因为标准保证:

    sizeof(char) <= sizeof(int) <= sizeof(double)
    

    也就是说char所代表的取值范围肯定包含在int所代表的取值范围内,int所代表的取值范围肯定包含在double所支持的取值范围内.

    【讨论】:

    • "就是char表示的取值范围肯定包含在int表示的取值范围内",不,char可以无符号。对于我使用的编译器,可以通过编译器选项选择该属性。
    • @Cheersandhth.-Alf 不是[0, 255] in [INT_MIN, INT_MAX]
    • 每个char 的位数由CHAR_BIT 中的&lt;limits.h&gt; 标头给出。它大于或等于 8。在一些德州仪器 DSP 上是 16。
    【解决方案4】:

    char 未转换为 intchar 的 ASCII 代码分配给 int 值。如果将char '5' 转换为int,则必须得到整数值 5。但你会得到 53,即 '5' 的代码。保存ASCII码的字节直接扩展为32位值。

    【讨论】:

      猜你喜欢
      • 2021-11-09
      • 2013-10-01
      • 2014-02-26
      • 2012-06-01
      • 2014-02-07
      • 2013-08-10
      • 2018-02-10
      • 2010-09-19
      相关资源
      最近更新 更多