short a;
short b;
short x;
int c = (int)a + (int)b * (int)x;
在这种情况下,我可以免除(int)演员吗?即,当编译器执行乘法和加法时,它是使用int中间变量还是使用短中间变量?
编辑:其他类型怎么样?
int32 a;
int32 b;
int32 x;
int64 c = (int64)a + (int64)b * (int64)x;
编辑2:在我看来
int64 c = a + b*x
会溢出,因为b * x是使用int算法计算的。更安全的表达是:
int64 c = a + (int64)b * (int64)x;
答案 0 :(得分:4)
对于short
的情况,转换是不必要的,因为short
值在算术表达式中被隐式提升为int
。
对于另一个示例,假设int32
和int64
是他们看起来的样子,如果int
小于64位,则必须进行强制转换。从技术上讲,对*
的操作数进行单一演员就足够了,例如:
int64 c = a + (int64)b * x;
b
首先转换为int64
,x
也会转换为int64
,因为*
会转换另一个操作数,如果它的排名较低,那么执行乘法,不能溢出。然后,出于同样的原因,a
会转换为int64
,因为另一个操作数为' +&#39}。排名更高。执行添加,它也不会溢出。最后,结果存储到c
。
答案 1 :(得分:1)
来自C ++标准(5.7添加运算符)
1添加剂操作符+和 - 从左到右组。通常 对算术或算术的操作数执行算术转换 枚举类型。
通常的算术转换包括排名小于类型int
的排名的对象转换为int类型时的整数提升。
同样适用于乘法运算符。
在您的示例中,类型为short
的操作数会自动转换为类型int
,编译器将使用类型为int
的操作数执行操作
因此,使用铸件并不是很有意义。:)
至于此代码段
int32 a;
int32 b;
int32 x;
int64 c = (int64)a + (int64)b * (int64)x;
然后你确实应该至少施放一个操作数
int64 c = a + (int64)b * x;
如果你想要那就不会有溢出。