【问题标题】:implicit conversion from lower to higher从低到高的隐式转换
【发布时间】: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


【解决方案1】:

感谢cmets! @JeJo 上面给出了答案。更具体地说:

如果我们省略所有 (unsigned long long) 转换,那么加法运算的结果将是一个整数(溢出),随后将转换为 unsigned long long。为了防止溢出,我们只需要保留一个 (unsigned long long) 类型转换,因为这样一个加法数字就是 ULL,而加法运算的其他部分也将被转换。因此,加法运算的结果将是一个 unsigned long long 数。

【讨论】:

    猜你喜欢
    • 2020-08-10
    • 2011-08-25
    • 2016-05-19
    • 2015-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-24
    相关资源
    最近更新 更多