ありがとうです。CHAR_MAXは127でした。
色々と理由を考えてたのですが、
(1) unsigned char a = 0xff;
(2) char a = 0xff;
cout << static_cast<int>(a<<8) << endl;
(1)のように書くと0xff00と出力され、
(2)のように書くと0xffffff00と出力されます。
unsigned charとcharではシフトの方法が違うんでしょうか?