Java の int 型の謎が今頃解った

int 型は 4 バイトなので 32 ビットですよね。

従って 2 の 32 乗通りの表現が可能。

そのうち符号に 1 ビット。

マイナス 2 の 31 乗から、プラス 2 の 31 乗から 1 を引いた範囲まで。

何故、正の範囲がマイナスの絶対値じゃないのか疑問に思ったが純粋無垢な私は素直にそういうものなんだと今まで思っていた。

ひょんなことからこの謎が解けた。

だからどうってことはないけど一応・・・覚え書きということで(^^;

Java の int 型の正の整数は 0 から始まるからだそうです。

int 型に限らず正負を扱う型はそうなるんでしょうね。

これってプログラマーの常識なんでしょうけど肉体労働者の私にとってはショックでした。

数学的に 0 は正でも負でもない特殊な存在だからです。

本当に今さら忘れていた疑問が解けて少しうれしい自分が可愛いと思う今日この頃です。(爆

Hatena タグ:

Tags:

2 Comments

  • shin より:

    単純に2の補数なので負の値が正の数より多いというだけでは?

    例えば2ビットだと2の補数を使ってー2、-1、0、1の4種類を表すことが出来ます。
    マイナスのほうが範囲が広いですね。
    つまり、0は正負どちらにも属していません。

    なぜ2の補数を使うかといえば、最上位ビットを単なる正負のフラグにつかってしまうと
    扱える数値が減ってしまうためです。
    2ビットだとー1、-0、+0、+1みたいな感じになって0がダブってしまうので不具合が発生してしまいます。
    0という数値がイコールで判断できなくなってしまうんですね。

    ほかにも2の補数は利点があります。検索で調べてみてください。

  • ゆっち より:

    shin さん、はじめまして。
    おっしゃる通り2の補数を使うからそうなりますね。
    私が目にした本には「正の整数は 0 からはじまる」と表現されてました。
    おそらく 0 の符号ビットが 0 だからそういう表現をしたのでしょう。
    なぜ 2 の補数を使うのか調べてみました。
    計算機の演算回路をシンプルにするためですね。
    減算を加算で処理できるように。
    これは今日調べてみて初めて知りました。
    4 ビットで 5-5 を例にすると
    5+(-5) だから

    0101
    +) 1011
    ———-
    10000

    4 ビットだからオーバーフローした上位ビットは切り捨てられて演算結果は 0 となる。
    とりあえず、検索上位の情報を調べてみました。
    これって基本情報技術者試験では出題率が高く必ずマスターしておかなければいけないことらしいですね。
    やっぱりこういうところで素人とプロフェッショナルの差が大きく現れます。
    コメントありがとうございました。(^^)

Leave a Reply