неявное преобразование из низшего в высшее - PullRequest
0 голосов
/ 09 декабря 2018

У меня есть следующая функция, которая находит минимальную сумму из 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;
}

Теперь, если я опускаю (беззнаковые длинные длинные) преобразования, я получаю переполнение.Кто-нибудь знает почему?Разве компилятор не должен автоматически преобразовывать int в unsigned long long?

1 Ответ

0 голосов
/ 19 декабря 2018

Спасибо за комментарии!Ответ дан выше @JeJo.Более конкретно:

Если мы опускаем все преобразования (без знака длинного длинного), то результатом операции добавления будет целое число (переполненное) и впоследствии будет преобразовано в длинный без знака длинного.Чтобы предотвратить переполнение, нам просто нужно сохранить одно из (длинных беззнаковых) приведений, потому что в этом случае одно из добавляемых чисел будет ULL, а остальные части операции добавления также будут преобразованы.Таким образом, результатом операции добавления будет длинное число без знака.

...