[#24536] 「Rubyの落し方」 v.s. ruby_1_8 — akira yamada / やまだあきら <akira@...>

<URL:http://jp.rubyist.net/magazine/?0002-RubyCore>

40 messages 2004/10/20
[#24541] Re: 「Rubyの落し方」 v.s. ruby_1_8 — Yukihiro Matsumoto <matz@...> 2004/10/20

まつもと ゆきひろです

[#24599] 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/26

2004-10-20 (水) の 21:38 +0900 に Yukihiro Matsumoto さんは書きました:

[#24605] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-26 (火) の 16:16 +0900 に akira yamada / やまだあきら さんは書きました:

[#24606] Re: 1.8.2 preview3? — Yukihiro Matsumoto <matz@...> 2004/10/27

まつもと ゆきひろです

[#24608] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 11:48 +0900 に Yukihiro Matsumoto さんは書きました:

[#24620] Re: 1.8.2 preview3? — akira yamada / やまだあきら <akira@...> 2004/10/27

2004-10-27 (水) の 12:42 +0900 に akira yamada / やまだあきら さんは書きました:

[#24629] Re: 1.8.2 preview3? — Tanaka Akira <akr@...17n.org> 2004/10/29

In article <1098888819.9446.14.camel@rice.p.arika.org>,

[ruby-dev:24403] Re: "a".sum(32) is 0

From: Tanaka Akira <akr@...17n.org>
Date: 2004-10-02 13:57:52 UTC
List: ruby-dev #24403
In article <1096723804.528548.31708.nullmailer@x31.priv.netlab.jp>,
  Yukihiro Matsumoto <matz@ruby-lang.org> writes:

> 説明されればそのように思うのですが、それだと私には
> sum=97, bits=32のとき
>
> 	    sum &= (1<<bits)-1;
>
> の結果、sumが0になる理由がよくわかりません。

1<<bits が 1 になるばあい、(1<<bits)-1 は 0 ですから、sum &= 0 が sum
を 0 にするというのは理にかなっていると思います。

> なにが起きているんでしょうね。
>
> gdbでは
>
>   p 1<<32
>
> が0を表示しますし(前のメールで0になると思った原因)。

おぉ。この gdb の挙動は知りませんでした。

% cat t.c 
#include <stdio.h>

int main()
{
  int n = 32;
  printf("1<<n = %d\n", 1<<n);
  printf("1<<32 = %d\n", 1<<32);
  return 0;
}
% gcc t.c  
t.c: In function `main':
t.c:7: warning: left shift count >= width of type
% ./a.out 
1<<n = 1
1<<32 = 0
% gcc --version 
gcc (GCC) 3.3.4 (Debian 1:3.3.4-6sarge1)
Copyright (C) 2003 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

まぁ、なんというか gcc の警告が問題を指摘していますが、リテラルとして
書いた場合と変数の場合で違うんですねぇ。

まぁそれはそれとして、規格からいうとこの場合の結果は決まっていなかった
はずです。なので、こういう挙動も規格に反しているわけではありません。

なぜ規格がそうなっているのかはそういう実装を許容するためだと思います。

なぜそういう実装になっているのかというのは、shift 命令に与えられた
shift 幅を下位 5bit しか見ないためです。なぜそれでいいと判断されたのか
は推測になりますが、shift 幅が 32以上なら結果は 0 に決まっているので、
そういう無駄な計算はあまり行なわれないと仮定されていたのではないかと思
います。
-- 
[田中 哲][たなか あきら][Tanaka Akira]

In This Thread