以下算术和是否需要强制转换?

Is casting necessary in the following arithmetic sum?

short a;
short b;
short x;
int c = (int)a + (int)b * (int)x;

在这种情况下我可以免除 (int) 转换吗?即当编译器执行乘法和加法时,它使用 int 中间变量还是使用 short 中间变量?

编辑:其他类型呢?

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;

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

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

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

b首先转换为int64x也转换为int64,因为*转换另一个操作数,如果它具有较低的等级,然后执行乘法,不能溢出。 a 然后出于同样的原因转换为 int64,因为 '+' 的另一个操作数具有更高的等级。添加被执行,它也不能溢出。最后将结果存入c.

来自 C++ 标准(5.7 加法运算符)

1 The additive operators + and - group left-to-right. The usual arithmetic conversions are performed for operands of arithmetic or enumeration type.

通常的算术转换包括当秩小于类型 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;

如果你希望不会溢出。