main() {
if (-1 < (unsigned char) 1)
printf("less than");
else
printf("NOT less than");
}
Imprime less than
. Parce que, (unsigned char) 1
est converti en(signed char) 1
et puis: (signed) -1 < (signed) 1
, ainsi la sortie est less than
.Promotion des types de données pendant les opérations arithmétiques: -1 <(uninged int) 1 == false
Mais si je change le code ci-dessus-if ((-1 < (unsigned int) 1)
alors la sortie est NOT less than
.
Il est donc évident que lorsque je change unsigned char unsigned int:
- (signé) -1 est converti en unsigned int [exactement à l'opposé qui se passe]
- depuis -1 est stocké en tant que complément de 2 de 1; le modèle binaire est évalué à 255 (probablement)
- , donc 255 < 1 sera évalué à faux et sera exécuté.
- même si vous remplacez
int a = -1;
à la place de « -1 » même résultat
Questions:
pendant signé et non signé arithmétique ... comment être sûr que signé sera converti en non signé ou vice versa.
pourquoi est conversion différent pour l'arithmétique entre unsigned char et le charbon: apparemment non signé est converti en signé et unsigned int et int: apparemment signé est convertisseur non signé
PS: Je sais que cela compilateur ne dépendants .. ne dites pas que c'est.
ne sont pas tous des littéraux standard int? (unsigned char -> int promotion vs int -> unsigned int promotion) – flownt