C++で無駄足

 128より大きな値が入ったcharからunsigned intでキャストしたりしてintに代入したら(正確には論理和だったんですが)負の数になってしまって一時間ぐらい困った。なぜか0xFFと論理積取ってから同じようにしたら期待通りに動いた。なんだ、これは。unsigned charにでもしなきゃならなかったのでしょうか。詳しい人教えてください_○(\ )_\_