One often needs to read from memory one byte at a time, like in this naive memcpy() implementation:
void *memcpy(void *dest, const void *src, si
You should use unsigned char. The C99 standard says that unsigned char is the only type guaranteed to be dense (no padding bits), and also defines that you may copy any object (except bitfields) exactly by copying it into an unsigned char array, which is the object representation in bytes.
The sensible interepretation of this is to me, that if you use a pointer to access an object as bytes, you should use unsigned char.
Reference: http://blackshell.com/~msmud/cstd.html#6.2.6.1 (From C1x draft C99)