C6297
Предупреждение C6297: арифметическое переполнение. 32-разрядное значение сдвигается, а затем приводится к 64-разрядному значению. Результат может оказаться непредвиденным значением.
Это предупреждение указывает неверное поведение, возникающее в результате действия внутренних правил продвижения и типов, более крупных, чем с которыми обычно выполняются арифметические операции.
В данном случае 32-разрядное значение было сдвинуто влево, а результат сдвига был приведен к 64-разрядному значению. Если при сдвиге 32-разрядное значение было переполнено, часть разрядов утеряна.
Чтобы не терять разряды, перед сдвигом следует привести значение к 64-разрядному. Если требуется потерять разряды, то следует использовать соответствующее приведение к длинному или короткому типу без знака или замаскировать результат сдвига, чтобы более четко оформить код и избежать появления данного предупреждения.
Пример
Это предупреждение создается следующим кодом:
void f(int i)
{
unsigned __int64 x;
x = i << 34;
// code
}
Для устранения этого предупреждения используйте следующий код:
void f(int i)
{
unsigned __int64 x;
// code
x = ((unsigned __int64)i) << 34;
}