Upozornění kompilátoru (úroveň 2) C4146
Unární minus operátor použitý typ bez znaménka výsledek stále nepodepsané
Nepodepsané typy může obsahovat pouze kladné hodnoty, Unární minus (negace) obvykle nedává smysl při použití na typ bez znaménka.Operand a výsledkem jsou kladné.
Prakticky k tomu dochází, když programátor se pokouší vyjádřit minimální celočíselnou hodnotu, která je-2147483648.Tuto hodnotu nelze zapsat jako-2147483648, protože výraz je zpracován ve dvou etapách:
Vyhodnocení číslo 2147483648.Vzhledem k tomu, že je větší než je maximální celočíselná hodnota 2147483647, není typ 2147483648 int, ale unsigned int.
Unární minus použita hodnota nepodepsaný výsledkem, který také 2147483648.
Typ bez znaménka výsledek může způsobit neočekávané chování.Pokud výsledek je použit v porovnání a potom porovnávání nepodepsané lze, například, jestliže jiné operand je int.To vysvětluje, proč níže uvedený příklad program vytiskne pouze jeden řádek.
Očekávaný druhý řádek 1 is greater than the most negative int, protože se nemá tisknout ((unsigned int)1) > 2147483648 false.
C4146 se můžete vyhnout pomocí INT_MIN z limits.h, který má typ int podepsán.
Příklad
Následující ukázka generuje upozornění 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);
}