C6297
警告 C6297: 算術オーバーフローです: 32 ビット値はシフトされ、64 ビット値にキャストします。 結果は予期した値にならないことがあります。
この警告は、整数の上位変換規則、および通常の算術演算の実行に使う型よりも大きい型が原因で、不適切な動作が発生することを示します。
この場合、32 ビット値は左にシフトされ、そのシフトの結果は 64 ビット値にキャストされました。 シフトが 32 ビット値をオーバーフローすると、ビットは失われます。
ビットが失われないようにするには、シフトする値を 64 ビットにキャストしてからシフトします。 ビットが失われてもよい場合は、符号なしの long 型または short 型への適切なキャストを実行するか、シフトの結果をマスクすることにより、警告を回避し、コードの意図を明確にすることができます。
使用例
この警告が発生するコード例を次に示します。
void f(int i)
{
unsigned __int64 x;
x = i << 34;
// code
}
この警告を解決するには、次のコードを使用します。
void f(int i)
{
unsigned __int64 x;
// code
x = ((unsigned __int64)i) << 34;
}