コンパイラの警告 (レベル 2) C4146
符号付きの値を代入する変数は、符号付き型にキャストしなければなりません。
符号なしの型が保持できるのは負でない値だけであるため、通常、単項マイナス (否定) は符号なしの型に使用しても意味をなしません。 オペランドと結果の両方が負でない値になります。
実際にこの警告が発生するのは、プログラマが最小整数値 -2147483648 の記述を試みた場合です。 式は次の 2 段階で処理されるため、この値を -2147483648 として記述することはできません。
数値 2147483648 が評価されます。 この数値は最大整数値 2147483647 より大きいため、2147483648 の型は int ではなく unsigned int です。
単項マイナスが値に適用され、符号なしの結果となり、値は 2147483648 となります。
結果が符号なしの型の場合、予期しない動作が発生する可能性があります。 結果が比較に使用される場合は、符号なしの比較を使用できます。たとえば、他方のオペランドが int の場合です。 このため、次のサンプル プログラムでは 1 行だけが出力されます。
予期される 2 行目の 1 is greater than the most negative int は、((unsigned int)1) > 2147483648 が false であるため出力されません。
C4146 は、limits.h から signed int 型を持つ INT_MIN を使用すると回避できます。
使用例
次の例では警告 C4146 が生成されます。
// C4146.cpp
// compile with: /W2
#include <stdio.h>
void check(int i)
{
if (i > -2147483648) // C4146
printf_s("%d is greater than the most negative int\n", i);
}
int main()
{
check(-100);
check(1);
}