I am currently using the uint8_t approach. The way I see it is, if a platform does not have an 8 bit type (in which case my code will not function on that platform), then I don't want it to be running anyways, because I would end up with unexpected behaviour due to the fact that I am processing data with the assumption that it is 8 bits, when in fact it is not. So I don't see why you should use unsigned char, assume it is 8 bits, and then perform all your calculations based on that assumption. It's just asking for trouble in my opinion.