C macht keine Arithmetik mit Typen, die kleiner als ein int sind. In so einem Fall wird dann einfach erstmal nach "int" konvertiert. Das "unsigned" ist bei einem char also nutzlos. Du müßtest das Resultat der zweiten Subtraktion nach "unsigned char" casten, also (unsigned char)(c-d). Vgl...