Указатель C ++ Предупреждение: переполнение Arithmeti c: использование оператора '-' для 4-байтового значения и последующее приведение результата к 8-байтовому значению - PullRequest
0 голосов
/ 17 апреля 2020

Когда я запускаю эту функцию, он выдает мне 2 предупреждения для setw(*torPtr - *harePtr) и setw(*harePtr - *torPtr)

В нем говорится:

Arithmeti c переполнение: Использование operator ' - 'на 4-байтовое значение и затем приведение результата к 8-байтовому значению. Приведите значение к более широкому типу перед вызовом оператора '-', чтобы избежать переполнения (io.2).

Как это исправить, пожалуйста?

void Posi(const int* const tPtr,const int* const hPtr)
{
    if (*hPtr == *tPtr) {
        cout <<setw(*hPtr) << "bang!" << '\a';  
    }
    else if (*hPtr < *tPtr) {
        cout << setw(*hPtr) << 'H' << setw(*tPtr - *hPtr) << 'A';
    }
    else {
        cout  << setw(*tPtr) << 'T' << setw(*hPtr - *tPtr) << 'B';
    }
}

1 Ответ

1 голос
/ 17 апреля 2020

При использовании Visual Studio я также получаю эту ошибку. Изучив setw, который я связал с #include <iomanip>, я обнаружил, что setw снабжен параметром streamsize, который на самом деле является long long.

В результате возникает проблема, заключающаяся в том, что вы пытаемся привести арифметическое c результат двух int (с размером 4 байта) к long long (с размером 8 байтов), чтобы соответствовать определению streamsize в setw.

Переполнение, вызванное арифметической операцией c, не даст правильных результатов. Если вы хотите узнать, как возникает переполнение, вы можете взглянуть на следующую веб-статью https://www.cplusplus.com/articles/DE18T05o/.

Чтобы устранить проблему, вам необходимо предотвратить переполнение. происходящего, что может быть достигнуто путем приведения значений к большему типу данных. Например:

const long long value_cast = static_cast<long long>(*tPtr) - static_cast<long long>(*hPtr);
cout << setw(*hPtr) << 'H' << setw(value_cast) << 'A';

Я надеюсь, что это ответит на ваш вопрос. :)

Редактировать: Я изменил приведение с стиля c на stati c. Спасибо за ваш вклад anastaciu !

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...