Поделиться через


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;
}

См. также

Ссылки

Предупреждение компилятора (уровень 1) C4293