Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的隐式类型转换规则+;操作员_C++_Casting_Implicit - Fatal编程技术网

C++ C+中的隐式类型转换规则+;操作员

C++ C+中的隐式类型转换规则+;操作员,c++,casting,implicit,C++,Casting,Implicit,我想更好地知道我应该在什么时候出演。当添加、乘法等时,C++中的隐式类型转换规则是什么?例如: int + float = ? int * float = ? float * int = ? int / float = ? float / int = ? int / int = ? int ^ float = ? 等等 表达式是否总是作为更精确的类型计算?Java的规则不同吗? 如果我对这个问题的措辞不准确,请纠正我。涉及float的算术运算会导致float int + float = flo

我想更好地知道我应该在什么时候出演。当添加、乘法等时,C++中的隐式类型转换规则是什么?例如:

int + float = ?
int * float = ?
float * int = ?
int / float = ?
float / int = ?
int / int = ?
int ^ float = ?
等等

表达式是否总是作为更精确的类型计算?Java的规则不同吗?
如果我对这个问题的措辞不准确,请纠正我。

涉及
float
的算术运算会导致
float

int + float = float
int * float = float
float * int = float
int / float = float
float / int = float
int / int = int
int + float =>  float + float = float
int * float =>  float * float = float
float * int =>  float * float = float
int / float =>  float / float = float
float / int =>  float / float = float
int / int                     = int
int ^ float =>  <compiler error>
有关更多详细信息,请参阅答案。看看C++标准中的第5/9节怎么说< /P> 许多二进制运算符 算术或枚举的操作数 类型原因转换和产量 结果类型以类似的方式显示。这个 目的是产生一种普通类型, 这也是结果的类型

这种模式被称为普通模式 算术转换,即 定义如下:

-如果任一操作数的类型为long 双精度,另一个应转换 长双

-否则,如果 操作数为双精度,另一个应为双精度 转换成双倍

-否则,如果 两个操作数中的一个为浮点,另一个为浮点 应转换为浮动

-否则,整体促销 (4.5)应在两个 操作数(0.54)

-然后,如果任意一个操作数 无符号长,则另一个应为 转换为无符号长字符

-否则,如果一个操作数是长的 int和另一个无符号int,然后 如果一个长整型可以表示所有 无符号int的值 无符号整数应转换为整数 长整型;否则,两个操作数 应转换为无符号长字符 内部的

-否则,如果任一操作数为 长,另一个应转换为 长

-否则,如果任一操作数 如果未签名,则另一个应为 已转换为未签名

[注:否则,唯一剩下的情况是 两个操作数都是int]


当表达式的类型不是两个部分都属于同一类型时,将转换为两个部分中最大的一个。这里的问题是理解哪一个比另一个大(它与字节大小无关)

在涉及实数和整数的表达式中,整数将提升为实数。例如,在int+float中,表达式的类型是float


另一个区别与类型的功能有关。例如,一个包含int和long int的表达式将产生long int类型。

整个第4章都讨论了转换,但我认为您应该对以下内容感兴趣:

4.5积分促销 [conv.prom]
char、signed char、unsigned char、short int或unsigned short类型的右值 如果int可以表示源类型的所有值,则int可以转换为int类型的右值;其他-
明智地说,源右值可以转换为unsigned int类型的右值。
wchar_t(3.9.1)类型或枚举类型(7.2)的右值可以转换为第一个右值
可以表示其基础类型的所有值的以下类型之一:int、unsigned int、
长,或无符号长。
如果int可以表示所有值,则整数位字段(9.6)的右值可以转换为int类型的右值
位字段的值;否则,如果unsigned int可以表示-
重新发送位字段的所有值。如果位字段更大,则不会对其应用积分提升。如果
位字段具有枚举类型,出于提升目的,它被视为该类型的任何其他值。
bool类型的右值可以转换为int类型的右值,false变为零,true
成为一个。
这些转换称为整体促销

4.6浮点推广 [conv.fpprom]
float类型的右值可以转换为double类型的右值。该值保持不变。
这种转换称为浮点提升

因此,所有涉及float的转换-结果是float

仅涉及两个int的一个-结果为int: 在C++运算符(对于POD类型)中,INT/INT= INT/P>< P>总是作用于同一类型的对象。 因此,如果它们不相同,将提升一个以匹配另一个。
运算结果的类型与操作数相同(转换后)


注意。操作的最小大小为
int
。因此,在操作完成之前,
short
/
char
被提升为
int

在所有表达式中,在执行操作之前,
int
被提升为
float
。该操作的结果是一个
浮点

int + float = float
int * float = float
float * int = float
int / float = float
float / int = float
int / int = int
int + float =>  float + float = float
int * float =>  float * float = float
float * int =>  float * float = float
int / float =>  float / float = float
float / int =>  float / float = float
int / int                     = int
int ^ float =>  <compiler error>
int+float=>float+float=float
int*float=>float*float=float
浮点*int=>float*float=float
int/float=>float/float=float
float/int=>float/float=float
int/int=int
int^float=>

如果排除未签名的类型,则有一个有序的 层次结构:有符号字符、短字符、整型、长字符、长字符、浮点、, 双人,长双人。首先,在 将转换为int。然后,在二进制操作中, 排名较低的类型将转换为排名较高的类型,而排名较低的类型 结果将是较高的类型。(你会注意到,从 层次结构、浮点和整型都是 其中,整数类型将转换为浮动类型 点类型。)

Unsigned会使事情变得有点复杂:它会扰乱排名,并且 部分排名将由实现定义。因为 在这种情况下,最好不要将有符号和无符号混合在一起 表情。(大多数C++专家似乎避免了未签名的除外。 这涉及到按位操作,至少是什么
Stroustrup建议。)

这个答案在很大程度上是针对@RafałDowgird的评论:


“操作的最小大小为int。”-