From: EGUCHI Osamu Date: 1999-12-06T20:11:28+09:00 Subject: [ruby-dev:8548] Re: BIGDN えぐち@エスアンドイー です。 >>> In message [ruby-dev:8544] Re: BIGDN On Mon, 6 Dec 1999 18:13:56 +0900, toyofuku@juice.or.jp said: 豊福> 豊福です。 豊福> 豊福> [ruby-dev:8527] えぐちさん 豊福> > x の符号の有無や x の MSB が1の時の挙動はansi では実装依存なので、 豊福> > x を正に正規化しシフトする元のバージョンの実装は的確だと思います。 豊福> 豊福> (-1)>>1 == -1 のチェックによる効率化はすでに 豊福> 入っているのですからついでにもうちょっとチェック 豊福> を増やしてもいいかなと。 チェックを増やす事には、反対しませんが、configure.in の AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>y) : (x)>>y)) を AC_DEFINE(RSHIFT(x,y), ((x)<<(signed int)(y)) とした場合 ANSIC 的には、問題が出る処理系があり得ます。(後述) 豊福> ところで、 豊福> > x の符号の有無や x の MSB が1の時の挙動はansi では実装依存なので、 豊福> 豊福> この「符号」って正負? signed,unsigned ? 豊福> それとも両方ともですか。 判りづらくて済みません。 x >> y の x が signed の場合 かつ 負の場合、 結果は処理系に依存します。 #和訳 K&R 第2版の P-253 A4.7シフト演算子の #後ろのパラグラフの『E1>>E2 の値は、……』 これは、Intel で言う SAL が用意されていないプロセッサを 対象とする処理系を想定しているように思えます。 その場合は、「(x)<<(signed int)(y)」では解決しません。 大体、y の型(符合)が結果に影響を与えて良いとは ANSIC は 言っていないので、hpux-10.x はその点が非準拠に思えます。 豊福> signed だろうが unsigned だろうが MSB が 0 の 豊福> ときの右シフトは MSB に 0 が入ってくるというのだ 豊福> けはさすがに大丈夫なんですよね。 K&R2(≒ANSIC)に準拠する限り大丈夫そうです。 豊福> > x の MSB が1の時の挙動はansi では実装依存なので、 豊福> 豊福> とすると x が unsigned のときは 豊福> (((x)<0) ? ~((~(x))>>BITSPERDIG) : (x)>>BITSPERDIG) 豊福> もまずくないですか。必ず (x)>=0 なので。 豊福> 豊福> (((long)(x)<0) ? ~((~(x))>>BITSPERDIG) : (x)>>BITSPERDIG) 豊福> ですか? いえ、RSHIFT() や BIGDN() の場合、x が signed か unsigned かで MSB を変えないのか、0が入るのかを制御しているので、これでいいです。 #要するに、x が signed では SAR に相当するコードを、 #x が unsigned では SHR に相当するコードを生成して欲しいわけです。 (x)<<(signed int)(y) だと、hpux では両方に SAR に相当する コードを生成してしまう気がします。(手元にないので未検証) えぐち