Soustraction entre deux nombres non signés

Bonjour,

Soit X=10, et Y=20.
Si X et Y sont des uint16_t ou des uint32_t, j'obtiens un entier positif.
Si X et Y sont des uint8_t j'obtiens un nombre négatif

C'est par exemple le problème si je fais
if (X-Y>20)...

Quelle est la règle? Pourquoi sur 8 bits ce n'est pas pareil que sur 16 ou 32 bits? Le compilateur fait-il une opération X-Y sur 16 bits par défaut même si X et Y sont des uint8_t?...

Je pense que la soustraction des 2 uint8_t donne bien un résultat négatif mais le résultat doit être placé dans un uint16_t pour le test, sans propagation du signe puisque les 2 variables sont unsigned.

Je pense que la norme dit que dans une expression, si les la taille des opérandes est plus petite que celle de l'int, ils sont promus en int. Donc dans le cas des unit_8, on fait le calcul en signé.
Par contre dans le cas des uint16_t et uint32_t on fait le calcul en unsigned, donc le résultat ne peut être négatif.

J'arrive à m'en tirer en écrivant if (uint8_t(X-Y)>20)..., mais je ne vois pas l'intérêt que le compilateur fasse le calcul avec des int 16bits alors que le micro est en 8 bits!

Une solution est de passer par une variable supplémentaire, mais c'est du gâchis!