繁体   English   中英

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

[英]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 ,则可以通过赋予intchar相同的值来使用它来初始化int 这并不奇怪。

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

我认为您所关心的-(对于任何体系结构都应考虑的)-是将一个char并“传递给它”作为int 但这不是将char转换为int作用。 就是使用reinterpret_cast转换为int& 这种转换是危险的,并可能触发不确定的行为; 不仅因为intchar不具有相同的大小,还因为它们即使具有相同的大小也可能不具有相同的表示形式。

根据C ++标准,数字类型之间的提升是合法的。 意味着,此功能是C ++语言的一部分。

专门针对您所涉及的促销,可以将char提升为int并将int提升为double而不损失精度,因为该标准保证:

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

也就是说, char表示的值的范围肯定包含在int表示的值的范围内,而int表示的值范围肯定包含在double所支持的值的范围内。

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

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

自从1998年(包括该标准化工作)以来,C ++已经获得了另外三种专用的字符类型: wchar_tchar16_tchar32_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM