unsigned char a = 0xff;
このaをsigned shortに変換するのに

(signed short)aじゃだめで
(signed short)(signed char)aでないと駄目なのはどうしてですか?