Condividi tramite


Avviso del compilatore (livello 2) C4146

operatore "meno" unario utilizzato con tipo unsigned. Il risultato resta unsigned

I tipi unsigned possono contenere solo valori non negativi. In genere, quindi, non ha senso applicare l'operatore meno unario (negazione) a un tipo unsigned. Sia l'operando che il risultato sono non negativi.

In pratica, questa situazione si verifica quando il programmatore cerca di esprimere il valore intero minimo, ossia -2147483648. Questo valore non può essere scritto come -2147483648, poiché l'espressione viene elaborata in due fasi:

  1. Viene valutato il numero 2147483648. Poiché tale numero è maggiore del valore integer massimo di 2147483647, il tipo di 2147483648 non è int, ma unsigned int.

  2. L'operatore meno unario viene applicato al valore, con un risultato unsigned corrispondente a 2147483648.

Il tipo unsigned del risultato può causare un comportamento imprevisto. Se si utilizza il risultato in un confronto, è possibile che venga utilizzato un confronto unsigned, ad esempio quando l'altro operando è un int. È chiaro quindi il motivo per cui il programma di esempio riportato di seguito stampa una sola riga.

La seconda riga prevista, 1 is greater than the most negative int, non viene stampata perché ((unsigned int)1) > 2147483648 è false.

Per evitare la visualizzazione dell'avviso C4146, utilizzare INT_MIN da limits.h, il cui tipo è signed int.

Esempio

Il seguente codice di esempio genera l'errore 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);
}