C++相談室 part11
■ このスレッドは過去ログ倉庫に格納されています
0343デフォルトの名無しさん
NGNG移植性を考えたときによく分からなくなってきたので質問させていただきます。
最初は以下のようにしました。
void writeInt32(std::ostream &o, long v)
{
o.write((char*)&v, sizeof(v));
}
これだと以下のようなことが気になりました。
・long*をchar*にした結果は実装依存?
・sizeof(long)が4とは限らない
・longが負の時のビットパターンが2の補数表現とは限らない
というわけでとりあえず次に以下のようにしました。
o.put(v & 0xff);
o.put((v >> 8) & 0xff);
o.put((v >> 16) & 0xff);
o.put((v >> 24) & 0xff);
ところが、putの引数はcharなんです。
プログラミング言語C++第三版の付録C.3.4(p.942)の下の方には
> void f(char c, signed char sc, unsigned char uc)
> {
> c = 255; // 限定無しのcharがsignedで8ビットなら未定義
とあります。
つまり、(v & 0xff)の結果が255の場合、o.put(v & 0xff)は未定義なのではないでしょうか?
あと、負数が2の補数表現でない場合も考えないといけなそうです。
結局標準C++の範囲内でなんとかするのは不可能なのでしょうか?
■ このスレッドは過去ログ倉庫に格納されています