新井です。

In message "[ruby-dev:16537] Re: sprintf("%u")"
  on 22 Mar 2002 12:34:35 +0900,
  matz / ruby-lang.org (Yukihiro Matsumoto) wrote:
> まつもと ゆきひろです

> あ、10進では負だからといって決まった整数の連続にならないので、
> ..に意味がないという話かもしれませんね。それは一理あるので直

そうです。言葉が足らなかったようですね。申し訳ないです。

> したいのですが、となるとどのような表示が適切かというのは良く
> 分かりません。
> 
>   * そもそも%uに負の数を指定するほうが悪い。例外。
>   * なんらかの方法で正の数に変換して出力
>   * その他
> 
> くらいが戦略でしょうが、後二者については具体的にアイディアが
> ないですねえ、とくに10進について。

2の補数表現で最上位ビットが無限に続く数値に対して符号無し整
数を要求するというのば、利用者の意図は引数を固定長の整数とし
てみなしたいのだと想像します。

なので、安易に Ruby の内部表現のサイズの整数を符号無しにして
しまえばと思ったのです。はっきりいって現状でそういう出力をし
てますよね。(".."が頭につくことを除けば)

幸い内部表現のサイズは size メソッドで公開してますし、あまり
抵抗は感じないなと思ったのです。

  n = -10 ** 10
  p "%u" % n
  p "%d" % (n & ~(-1 << (n.size*8)))

  => "..18446744063709551616"
     "18446744063709551616"

まあ、そもそも %u なんていらないという説もありそうですが。

--
新井康司 (Koji Arai)