計算過程ではunsigned charではなくて、signed intで処理したら?
キャストする前にunsigned charの範囲内にクランプしてみては?