【发布时间】:2018-12-09 12:31:52
【问题描述】:
我有以下函数可以找到 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 吗?
【问题讨论】:
-
当您添加两个
ints 时,您得到的结果数字为int。想象两个 INT_MAX 数字相加,结果将是一个 Intger,其中已经发生了溢出。在此溢出之后发生到unsigned long long(maxSum) 的隐式转换。因此,在将它们相加之前,您需要将整数转换为更高的类型。 -
你只需要转换其中一个操作数,不需要对所有操作数都这样做
标签: c++ type-conversion implicit