"long long = int + int "先计算,然后类型转换?

"long long = int + int " first calculate ,then type conversion?

本文关键字:int long 然后 类型转换 计算      更新时间:2023-10-16

当我读取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",首先计算,然后键入转换?那么这些规则是什么呢?

的主要目的

long long int sum1 = x + y;

是评估表达式CCD_ 1
请注意,;是一个序列点,这意味着表达式的任何副作用都必须在到达该点时执行
这里的副作用是将表达式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
相关文章: