>>8
「リテラルの数値256での剰余だから結果の範囲は0-255、
unsigned char の範囲からはみ出す可能性はない」
ということまでコンパイラが見抜いてくれないってことだよね。

data8 = (unsigined char) data32;

てな具合に明示的なキャストで上手くいかんかな。
あるいはコンパイラの最適化オプションを強めにするか。