Mi sembra tutto ok ...
Per l'ultima printf la spiegazione è semplice ... dato che devi operare con dei byte (senza considerare il loro segno) allora dovrai usare in tutto il programma degli
unsigned char
altrimenti il segno viene automaticamente preso in considerazione e dato che 80 esadecimale è un numero negativo, il bit del segno viene esteso al valore a 32 bit e mostrato con tutte quelle F