コンパイラの警告 (レベル 1) C4319

'~': 'type1' からより大きいサイズの 'type2' へのゼロ拡張です

~ (ビットごとの補数) 演算子の結果は符号なしであるため、より大きい型に変換するとゼロ拡張になります。

次の例では、~(a - 1) が 32 ビットの unsigned long 式として評価され、ゼロ拡張によって 64 ビットに変換されます。 これは、予期しない操作結果になる可能性があります。

// C4319.cpp
// compile with: cl /W4 C4319.cpp
int main() {
   unsigned long a = 0;
   unsigned long long q = 42;
   q = q & ~(a - 1);    // C4319 expected
}