[英]Why can a compiler convert char to int in C++?
通过使用Java编程以及现在使用C ++进行编程,我发现您可以将char
转换为int
,然后将int
转换为double
。
我想知道为什么可以将char
转换为int
?
在C ++中,它们没有分配给它们相同数量的内存, char
是8位,而int
是32位。 那么这是如何工作的呢?
这就是编译器的设置方式吗? 我只想要一个解释。
感谢您提供的所有帮助!!
在某些体系结构上, char
可以容纳的每个值, int
也可以容纳。 因此,如果您有一个char
,则可以通过赋予int
与char
相同的值来使用它来初始化int
。 这并不奇怪。
在其他架构上,情况并非如此。 C ++仍然允许将任何整数类型转换为任何其他整数类型。 这必须是正确的,因为在C中也允许它,但是您可以使用大括号初始化来防止这种“缩小”的转换。
我认为您所关心的-(对于任何体系结构都应考虑的)-是将一个char
并“传递给它”作为int
。 但这不是将char
转换为int
作用。 这就是使用reinterpret_cast
转换为int&
。 这种转换是危险的,并可能触发不确定的行为; 不仅因为int
和char
不具有相同的大小,还因为它们即使具有相同的大小也可能不具有相同的表示形式。
根据C ++标准,数字类型之间的提升是合法的。 意味着,此功能是C ++语言的一部分。
专门针对您所涉及的促销,可以将char
提升为int
并将int
提升为double
而不损失精度,因为该标准保证:
sizeof(char) <= sizeof(int) <= sizeof(double)
也就是说, char
表示的值的范围肯定包含在int
表示的值的范围内,而int
表示的值范围肯定包含在double
所支持的值的范围内。
冻结的历史。 C ++基于C,但仍然几乎将C作为适当的子集。 在1970年代,当C语言被开发出来时, 字节和字符之间没有太大的区别:几乎所有(如果不是绝对的话),主要的文本编码每个字符使用一个字节。
在现代C ++ char
及其两个变体中, unsigned char
和signed char
只是基本字节类型,其中字节被定义为内存的最小可寻址单位,当用于字符时, char
只是基本编码单位(例如,使用UTF- 8个字符由1到5个字节(我认为是字节)组成。
自从1998年(包括该标准化工作)以来,C ++已经获得了另外三种专用的字符类型: wchar_t
, char16_t
和char32_t
,但不幸的是,没有强类型的字符类型。
编译器选项或设置不会影响char
是否隐式转换为整数,但会影响plain 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
与该优化一起正常工作。
char
不会转换为int
。 char
的ASCII码分配给int
值。 如果将char
'转换为int
,则必须获得整数值5。但是您将得到53,这是代码'5'。 保存ASCII码的字节直接扩展为32位值。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.