以下算术和是否需要强制转换?
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
。
对于另一个例子,假设 int32
和 int64
是它们看起来的样子,如果 int
小于 64 位,则强制转换是必要的。从技术上讲,对 *
的一个操作数进行一次强制转换就足够了,例如 :
int64 c = a + (int64)b * x;
b
首先转换为int64
,x
也转换为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;
如果你希望不会溢出。
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++ 标准(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;
如果你希望不会溢出。