C++ 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
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。”-