当我读到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”,首先计算,然后输入类型转换? 那么这些规则是什么?
答案 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