A karakter: igazából mindegy, előjeles-e, vagy sem, ugyanis nem számokat tárolsz benne, hanem karaktereket. Ha számokat akarsz:
typedef unsigned char byte;
vagy a kernelnek megfelelően:
typedef unsigned char u_int8_t;
A #define-nal az a baj, hogy nehéz vele hibát keresni, hiszen a gcc nem is ezt fordítja le, hanem az előfeldolgozó által átalakított változatot (gcc -E -o almafa.kimenet almafa.c paranccsal ugyanazt kapod, amit valójában fordítani fog).
A konstansok, típusok csak a forráskódban léteznek, amint lefordítod, azonnal teljesen más kerül a helyére, tehát elég nehezen fogod tudni megkeresni a hibákat például gdb segítségével.