>>345
>数値表現の可能性を論じてたら先に進まない。
全くその通りですね。2の補数ではない時を考えて負だったらビット反転させて1足して……とかアホなことをやろうかと思ったところで目が覚めました。

>unsigned long l = (unsigned)v;
>としてからo.put(l & 0xff)として書き込むのが良いかと。
実用上これで問題ないと思うのですが、C++標準でsigned charの範囲以上の値を使用した場合の動作が未定義となっているならちょっと怖いなと思ったもので。
どなたかこのコードでうまくいかない環境をご存じの方いらっしゃいますか?

>>346
私もその可能性はあるかなとは思いましたが、一応値渡しですし、代入していることになるのかなと。うーん……