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

标签 c casting overflow

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 - 以下算术和是否需要强制转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30653049/

相关文章:

c - 语法错误 : expected expression before ‘do’

c# - 通用类型转换

html - 容器中的文本溢出

ios - ios 上的溢出菜单类似于 android

css - 如何使 overflow CSS 属性在嵌套表上起作用?

c - 为什么我不能使用按位异或来交换字符串中的字符?

c++ - 是否需要释放(或删除)传递给 C 中的 main 的参数?

c++ - 有没有办法向原始类型添​​加转换运算符?

c - a-b>0 和 a>b 之间的区别

.net - 为什么十进制->字节转换会发生溢出异常,而uint->字节却不会?