んー、あれ、ちょっと待てよ。
(unsigned char)0-(unsigned char)1
は、ずっと unsigned char のままで演算されないか?