Lorsque l'on compare signé avec non signé, le compilateur convertit la valeur signée non signé. Pour l'égalité, ce n'est pas grave, -1 == (unsigned) -1
. Pour les autres comparaisons, il importe, par exemple, ce qui suit est vrai: -1 > 2U
.
EDIT: Références:
5/9: (Expressions)
De nombreux opérateurs binaires qui attendent
les opérandes de l'arithmétique ou de l'énumération
type de provoquer des conversions et le rendement
les types de résultats de manière similaire. L'
le but est de produire un type commun,
ce qui est aussi le type du résultat.
Ce modèle est appelé l'habitude
l'arithmétique des conversions, qui sont
définis comme suit:
Si
l'opérande est de type long double, la
d'autres sont convertis à long
double.
Sinon, si l'un des deux opérandes
est double, l'autre doit être
converti en double.
Sinon, si
l'un des deux opérandes est float, l'autre
doit être converti en float.
Sinon, l'intégrale des promotions
(4.5) doit être effectuée sur les deux
opérandes.54)
Alors, si l'un des deux opérandes
est unsigned long de l'autre doit être
converti unsigned long.
Sinon, si l'un des opérandes est un long
int et l'autre unsigned int, alors
si un long int peut représenter toutes les
les valeurs d'un type unsigned int, le
unsigned int est converti en
long int, sinon les deux opérandes
doit être converti en unsigned long
int.
Sinon, si l'un des deux opérandes est
long, l'autre est converti à
long.
Sinon, si l'un des deux opérandes
n'est pas signée, l'autre doit être
convertis non signé.
4.7/2: (Intégrale des conversions)
Si le type de destination n'est pas signé,
la valeur obtenue est le moins
entier non signé conforme à la
source entier (modulo 2n où n est
le nombre de bits utilisés pour représenter
le type non signé). [Note: Dans un à deux,
en complément de la représentation, ce
la conversion est conceptuel et il est
pas de changement dans la séquence de bits (si il y
est pas de troncature). ]
EDIT2: MSVC des niveaux d'alerte
Ce qui est averti à ce sujet sur les différents niveaux d'alerte de MSVC est, bien sûr, les choix effectués par les développeurs. Comme je le vois, leurs choix en matière de signed/unsigned l'égalité vs plus de/moins de comparaisons sens, c'est totalement subjectif, bien sûr:
-1 == -1
signifie la même chose que -1 == (unsigned) -1
- je trouve que d'une interface intuitive de résultat.
-1 < 2
n'a pas la même signification que -1 < (unsigned) 2
- Ce qui est moins intuitif au premier coup d'œil, et de l'OMI qui mérite un "plus tôt" alerte.