代码之家  ›  专栏  ›  技术社区  ›  Grant Herman

为什么编译器可以在C++中将char转换为int?

  •  0
  • Grant Herman  · 技术社区  · 10 年前

    通过用java和现在的C++编程,我发现可以将 char int 然后 整数 double .

    我想知道为什么 烧焦 可以转换为 整数 ?

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

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

    感谢您的帮助!!

    4 回复  |  直到 10 年前
        1
  •  3
  •   Brian Bi    10 年前

    在某些架构上 char 可以保持 int 也可以保持。所以如果你有一个 烧焦 ,您可以使用它来初始化 整数 通过提供 整数 烧焦 持有。这并不奇怪。

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

    我想你关心的是——应该是 任何 建筑--是一种 烧焦 并将其作为 整数 。但这不是转换 烧焦 整数 做它 转换为什么 int& 使用 reinterpret_cast 会做的;这种转换是危险的,并可能引发未定义的行为;不仅仅是因为 整数 烧焦 不具有相同的大小,但也因为它们可能没有相同的表示,即使它们具有相同的尺寸。

        2
  •  0
  •   Cheers and hth. - Alf    10 年前

    冻结历史记录。C++是基于C的,并且几乎仍然将C作为一个合适的子集。在20世纪70年代,当C语言被开发出来时 字节 性格 :几乎所有,如果不是绝对所有,主要文本编码都使用每个字符一个字节。

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

    自1998年标准化以来(包括1998年),C++已经获得了三种更通用的字符类型: wchar_t , char16_t char32_t ,但不幸的是没有 强类型 这种类型。


    编译器选项或设置不影响 是否 烧焦 隐式转换为整数,但它们会影响是否 烧焦 是有符号或无符号类型。通常它是签名的,也是出于历史原因,这是不切实际的。作为一个签名类型,它与 有符号字符 ,例如,关于函数调用的重载解析,作为无符号类型,它与 无符号字符 .


    您可以使用 enum :

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

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

    然而,我更喜欢更轻松的类型检查

    enum Byte_char : Byte  {};
    

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

    就尺寸而言,这种类型实际上也可以定义为 struct ,因为据我所知,现有的C++编译器没有在单个字节中插入填充 结构 然而,这样的定义可能与 std::basic_string 这个 枚举 可以很好地进行优化。

        3
  •  0
  •   101010    10 年前

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

    特别是对于您所指的促销 char 可以升级为 int 整数 可以升级为 double 由于标准保证:

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

    这是由 烧焦 肯定包含在由 整数 值的范围由 整数 肯定包含在 双重的 .

        4
  •  -1
  •   i486    10 年前

    char 未转换为 int .的ASCII码 烧焦 被分配给 整数 价值如果您将 烧焦 “5”到 整数 ,你必须得到整数值5。但是你会得到53,这是代码“5”。保存ASCII码的字节直接扩展到32位值。

    推荐文章