C++ “long long=int+int”首先计算,然后进行类型转换?

C++ “long long=int+int”首先计算,然后进行类型转换?,c++,c,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,

当我阅读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=int+int,首先计算,然后进行类型转换? 那么这些规则是什么呢?

这些规则的主要目的是什么

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

首先对表达式求值,然后再赋值。只要所有操作数都是int,表达式的计算结果就是int。在发布的代码中,int sum2=x+y;相当于int-sum2=int-sum1;。C和C++标准文档在典型的推广和转换方面是相当清楚的。您的问题是,您的中间和很可能具有适当的大小,但由于您添加了两个int类型,因此转换将不会被保留。你需要把加法,而不是假设结果会给你作为一个长。C和C++作为单独的语言。