我有以下函数,可以找到4个数字的最小和和和最大和:
void miniMaxSum(vector<int> arr)
{
std::sort (arr.begin(), arr.end()); //(12 32 45 71)26 80 53 33
unsigned long long minSum = arr[0] + arr[1] + arr[2] + arr[3];
unsigned long long maxSum = (unsigned long long) arr[arr.size() - 1] + (unsigned long long) arr[arr.size() - 2] + (unsigned long long) arr[arr.size() - 3];
cout << arr[arr.size() - 1] << " " << arr[arr.size() - 2] << " " << arr[arr.size() - 3] << " " << arr[arr.size() - 4] << " " << endl;
cout << minSum << " " << maxSum << endl;
}
现在,如果我省略(unsigned long-long(转换,就会出现溢出。有人知道为什么吗?编译器不应该自动将int转换为unsigned long-long吗?
感谢您的评论!答案由@JeJo给出。更具体地说:
如果我们省略所有(unsigned long-long(转换,那么加法运算的结果将是一个整数(溢出(,随后将在unsigned long-long上进行转换。为了防止溢出,我们只需要保留其中一个(无符号长-长(强制转换,因为这样一来,其中一个加法数字就是ULL,加法运算的其他部分也会被转换。因此,加法运算的结果将是一个无符号的长-长数字。