In termini semplici, se si mescolano i tipi dello stesso valore (nella sequenza di int
, long int
, long long int
), il tipo unsigned "vince" ed i calcoli vengono eseguiti all'interno di quel tipo unsigned . Il risultato è dello stesso tipo senza segno.
Se si mescolano tipi di rango diverso, il tipo più elevato "vince", se può rappresentare tutti i valori del tipo con classificazione inferiore. I calcoli vengono eseguiti all'interno di quel tipo. Il risultato è di quel tipo.
Infine, se il tipo con classificazione più alta non può rappresentare tutti i valori di tipo con classificazione inferiore, viene utilizzata la versione senza segno del tipo con classificazione più alta. Il risultato è di quel tipo.
Nel tuo caso si tipi misti dello stesso valore (int
e unsigned int
), il che significa che l'intera espressione viene valutata all'interno unsigned int
tipo. L'espressione, come hai affermato correttamente, è ora 10 - 4294967254
(per 32 bit int
). I tipi non firmati rispettano le regole dell'aritmetica modulo con 2^32
(4294967296
) come modulo. Se si calcola attentamente il risultato (che può essere espresso aritmeticamente come 10 - 4294967254 + 4294967296
), risulterà come previsto 52
.
Perché non provi a vedere? – dandan78
@ dandan78 Voglio capire come funziona il compilatore sul sottostante –
@ dandan78: a volte può essere ingenuo; soprattutto se qualsiasi aspetto del calcolo non è definito. – Bathsheba