From: WATANABE Hirofumi Date: 2000-12-25T03:11:46+09:00 Subject: [ruby-dev:11831] Re: pack/unpack の '_' わたなべです. Koji Arai writes: :> :o どうして 'i'、'I' はどちらの場合もシステム依存なのか? :> :> これは C の int がそのまま mapping されているからです. :> i, I にも '_' をつけられます. : :えっと、'i', 'I' に '_' をつけても効果はないわけですよね? たしかに無視されます. iI の場合はつけてもつけなくてもシステム依存. :この辺のドキュメンテーションで :* '_' をつければ(数値のサイズに関して)システム依存になる :というわけでもなく :* '_' をつけなければ(数値のサイズに関して)システム依存ではない :というわけでもない点がすごく気持悪いです。 単に sSlL にはつけられるから iI にもつけられてもいいじゃんっ てことでしょう. 逆につけられないと気持ち悪い人もいるでしょう. :> nNvV は endian のためにあるので native integer とは関係ない :> からかなあ. : :そういうものなんでしょうか? C に nNvV に相当する integer は存在しないので. もともと pack/unpack は socket 通信のために作られたようなもんです. :> pack/unapck が Perl 由来である以上, それに追従するのはある意 :> 味当然でしょうね. : :まあ、そうですね。何か歴史的な理由をひきずってるのかしら? 歴史ということだと, 正確に 16/32 ビットを表現したいという要 請があったんだと思います(でもそれだけだと C の short/long が表現できない). Perl 5.003 までは sS は short/unsigned short, lL は long/unsigned long. だからシステムによっては sS/lL は 16/32 ビットとは限らない. Perl 5.004 からは sS は 厳密に 16ビット, lL は厳密に 32 ビット. Perl 5.6.0 からは ! で native (short/long) int にも対応. iI はずーっと C の int に依存. つまり ! を使うことで Perl 5.003 までの sSlL を表現できる. という感じです. 一方 Ruby のほうは, Ruby 1.2 までは sS は short/unsigned short, lL は long/unsigned long. Ruby 1.4 からは sS は 厳密に 16ビット, lL は厳密に 32 ビット. Ruby 1.6 からは ! に対応. かな. -- わたなべひろふみ でも 64 ビットマシンでもないと実感がわかないっつーか