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.