えぐち@エスアンドイー です。

>>> In message [ruby-dev:8558] Re: BIGDN
    On Tue, 7 Dec 1999 01:41:03 +0900, Toyofuku <toyofuku / juice.or.jp> said:

豊福>   豊福です。
豊福> 
豊福> [ruby-dev:8551] えぐちさん

豊福> > これは、[ruby-dev:8550] の通り、大丈夫ぢゃないですね。
豊福> 
豊福>   あれ? 紛らわしかったんですが、結局は大丈夫だと
豊福> いうつもりで書いたんです。
豊福>   改めて書くと
豊福>       long x = -1;
豊福>       unsigned long ux = -1;
豊福>       printf("%x\n",  x>>((int)1));      /* ffffffff */
豊福>       printf("%x\n", ux>>((int)1));      /* 7fffffff */
豊福> なので、
豊福> 少なくとも HP-UX 10 では ((x)>>((int)(y))) でOK。
豊福> と、思ったんですが勘違いしてます?

まさにその通りですね。

問題は、hpux-10 を特別扱いするあまり、
『x<0 の時、MSB に0が入って来る``ANSIC 準拠な処理系''の
  サポートを無くしては行けなかろう。』
と言うのが私の意見です。

とすると、

 AC_CACHE_CHECK(whether right shift preserve sign bit, rb_cv_rshift_sign,
     [AC_TRY_RUN([
 int
 main()
 {
   if (-1==(-1>>1)) /* unsigned へのキャストは外す */
     return 0;
   return 1;
 }
 ],
	 rb_cv_rshift_sign=yes,
	 rb_cv_rshift_sign=no,
	 rb_cv_rshift_sign=yes)])
 if test "$rb_cv_rshift_sign" = yes; then
   AC_DEFINE(RSHIFT(x,y), ((x)>>(int)y))
 else
   AC_DEFINE(RSHIFT(x,y), (((x)<0) ? ~((~(x))>>y) : (x)>>y))
 fi

とすべきでしょうか?

こうすれば、hpux-10 もそれ以外の処理系も、

  (x)>>(int)y)

を使って、
「x<0 の時、MSB に0が入って来る」処理系には、

  (((x)<0) ? ~((~(x))>>y) : (x)>>y)

が使われます。

ところで、実際に「x>>y で、x<0 の時も、MSB に0が入って来る」処理系は
存在するのでしょうか???

	えぐち