“long long = int + int”首先计算,然后键入转换?

时间:2016-07-22 02:55:19

标签: c++ c

当我读到caspp时,有一个问题可以确定是否可以在没有溢出的情况下添加参数。所以我写了以下代码。

//sum1 is long long ,so there is no overflow.
//when sum2 is overflow ,then sum1 != sum2;
int tadd_ok (int x,int y)
{
long long int sum1 = x + y;
int sum2 = x + y;
return sum1 == sum2;
}
然而,还有一些问题。 当我假设x = -2147483647,y = -2时,sum1和sum2都等于2147483747(两者都溢出!)。

我想,对于“long long = int + int”,首先计算,然后输入类型转换? 那么这些规则是什么?

1 个答案:

答案 0 :(得分:3)

的主要目的
long long int sum1 = x + y;

是评估表达式x + y
注意;是一个序列点,这意味着必须在达到该点时执行表达式的任何副作用。
这里的副作用是将表达式x + y的值赋给sum1

ISO / IEC 9899:201x-> 6.3.1.8-> 1 声明:

  

除非另有明确说明,否则常见的实际类型也是   相应的实际类型的结果..
  ..
  否则,将对两个操作数执行整数提升。那么   以下规则适用于升级的操作数:
   - 如果两个操作数具有相同的类型,则不需要进一步转换    - 否则,如果两个操作数都有有符号整数类型或两者都有无符号   整数类型,具有较小整数转换等级类型的操作数是   转换为具有更高等级的操作数的类型。

你想做的是

long long int sum1 = (long long int)x + y; // Casting x to LL causes y to be auto-converted