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