Udostępnij za pośrednictwem


C6297

Ostrzeżenie C6297: Przepełnienie arytmetyczne: 32-bitowa wartość jest przesunięta, a następnie rzutowana na wartość 64-bitową.Wynik może nie być wartością oczekiwaną

To ostrzeżenie wskazuje niepoprawne zachowanie które wynika z zasady promocji integralnej i typy większe niż te, w których zazwyczaj wykonywane są operacje arytmetyczne.

W tym przypadku 32-bitowa wartość została przesunięta w lewo i wynik tego przesunięcia był rzutowany na wartość 64-bitową.Jeśli przesunięcie przepełnia wartość 32-bitową, bity zostaną utracone.

Jeśli nie chcesz stracić bitów, rzutuj wartość, aby pasowała do 64-bitowej, zanim zostanie przesunięta.Jeśli chcesz stracić bity, wykonanie właściwego rzutowanie na typ unsigned long lub short lub maskowanie wyniku przesunięcia wyeliminuje to ostrzeżenie i uczyni zamiar tego kodu bardziej przejrzystym.

Przykład

Poniższy kod generuje to ostrzeżenie:

void f(int i)
{
  unsigned __int64 x;

  x = i << 34;
  // code 
}

Aby poprawić to ostrzeżenie, należy użyć następującego kodu:

void f(int i)
{
  unsigned __int64 x;
  // code
  x = ((unsigned __int64)i) << 34;
}

Zobacz też

Informacje

C4293 (poziom 1) ostrzeżenia kompilatora