是否需要以下算术总和?

时间:2015-06-04 20:00:04

标签: c casting overflow

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;

2 个答案:

答案 0 :(得分:4)

对于short的情况,转换是不必要的,因为short值在算术表达式中被隐式提升为int

对于另一个示例,假设int32int64是他们看起来的样子,如果int小于64位,则必须进行强制转换。从技术上讲,对*的操作数进行单一演员就足够了,例如:

int64 c = a + (int64)b * x;

b首先转换为int64x也会转换为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;

如果你想要那就不会有溢出。