Quando si confronta firmato con non firmato, il compilatore converte il valore firmato in unsigned. Per l'uguaglianza, questo non importa, -1 == (unsigned) -1
. Per altri confronti è importante, ad esempio, il seguente è vera: -1 > 2U
.
EDIT: Riferimenti:
5/9: (Espressioni)
Molti operatori binari che prevedono operandi di tipo aritmetico o di enumerazione causano conversioni e producono tipi di risultati in modo simile. Lo scopo è produrre un tipo comune, che è anche il tipo del risultato. Questo modello è chiamato le solite conversioni aritmetiche, che sono definite come segue:
Se uno degli operandi è di tipo long double, l'altro deve essere convertito in long double.
Altrimenti, se uno degli operandi è double, l'altro deve essere convertito in double.
Altrimenti, se uno degli operandi è float, l'altro deve essere convertito in float.
In caso contrario, le promozioni integrali (4.5) devono essere eseguite su entrambi gli operandi.54)
Quindi, se uno degli operandi è lungo senza segno, l'altro deve essere convertito in lungo senza segno.
Altrimenti, se un operando è un long int e l'altro unsigned int, allora se un long int può rappresentare tutti i valori di un unsigned int, il unsigned int deve essere convertito in un long int; altrimenti entrambi gli operandi devono essere convertiti in unsigned long int.
Altrimenti, se uno degli operandi è lungo, l'altro deve essere convertito in lungo.
Altrimenti, se uno degli operandi è senza segno, l'altro deve essere convertito in non firmato.
4.7 / 2: (Conversioni integrali)
Se il tipo di destinazione è senza segno, il valore risultante è il minimo intero senza segno congruente all'intero di origine (modulo 2 n dove n è il numero di bit utilizzati per rappresentare il tipo senza segno). [Nota: in una rappresentazione in complemento a due, questa conversione è concettuale e non vi è alcun cambiamento nello schema di bit (se non c'è troncamento). ]
EDIT2: livelli di avviso MSVC
Ciò di cui viene avvertito nei diversi livelli di avviso di MSVC sono, ovviamente, le scelte fatte dagli sviluppatori. Per come la vedo io, le loro scelte in relazione all'uguaglianza firmato / non firmato rispetto a confronti maggiori / minori hanno senso, questo è del tutto soggettivo ovviamente:
-1 == -1
significa lo stesso di -1 == (unsigned) -1
- lo trovo un risultato intuitivo.
-1 < 2
non significa lo stesso di -1 < (unsigned) 2
- Questo è meno intuitivo a prima vista e IMO merita un avvertimento "anticipato".