山本です。

>> なぜ警告が出るのか探していて見つけたのですが、
>> 
>> http://wisdom.sakura.ne.jp/programming/c/c13.html
>> 
>> によると、int から char への変換は下位8ビットをマスクしたのと同じ挙動を
>> 示すそうです。(言われてみると納得できる気もするのですが、なんか意外でした。
>> C++ の bool のような感覚で、なんとなく非負の int は非負の char になるように思い込んでました。)
>
>CHAR_BIT == 8 の場合は、ですね。
>
>> 符合があるときもこの挙動なのか、よく調べてませんが、これが本当なら
>> marshal.c の & 0xff は char へのキャストに置き換えられると思います。
>
>だから、厳密にいうとまったく同じとはいえませんが、この場合はむ
>しろキャストのほうが適切だと思います。

w_byte(rb_reg_options(obj), arg); はどうしましょうか? KCODE と論理和をとってる
ように見えたので、将来 m17n 化したときに 128 を超えてしまうんんじゃないかと思いました。

いっそ、

int option = rb_reg_options(obj);
if (option > 128) rb_bug("it's time to think about m17n");
w_byte((char)option, arg);

とかしておくとか・・・