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
。
对于另一个例子,假设 int32
和 int64
是它们看起来的样子,如果 int
小于 64,则强制转换是必要的位。从技术上讲,对 *
的操作数进行一次强制转换就足够了,例如:
int64 c = a + (int64)b * x;
b
先转为int64
,x
也转为int64
,因为*
转换另一个操作数,如果它具有较低的等级,然后执行乘法,这不会溢出。 a
然后出于同样的原因转换为 int64
,因为 '+' 的另一个操作数具有更高的等级。添加被执行,它也不能溢出。最后将结果存储到c
。
关于c - 以下算术和是否需要强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653049/