ページ 1 / 1
int型の範囲
Posted: 2010年4月18日(日) 18:33
by asdf
int型の範囲は、-32768~32767ですが、なぜ正の値と負の値が違うのでしょうか。
調べてみたら、2の補数が関係あることがわかったのですが、よく分かりませんでした。
どなたか分かりやすく説明してください。
Re:int型の範囲
Posted: 2010年4月18日(日) 19:56
by Poco
上限が同じ場合、0を入れることが出来ないからです。
Re:int型の範囲
Posted: 2010年4月18日(日) 20:03
by たかぎ
Re:int型の範囲
Posted: 2010年4月18日(日) 22:40
by Ma
簡単に説明すれば、こんなかんじかな、(間違いがあるかもしれないので注意してね)
1111 1111 1111 1111
=
1+2+4+8+16+32+64+128+256+512+1024+2048+4096+8192+16384+(+)
(等比数列の和)
=a*((r^n-1)/(r-1)
=(1)*(2^(15)-1)/(2-1)
32767
最初のビットでプラスかマイナスか決まるらしいけど、どっちがどっちか知りません(汗)
というのは、前提として、
可能性を計算すれば、
2バイトなら、16ビット
2^16=65536
の可能性があります。
unsigned int なら、
1 から 65536 だけあらわせることになりますが、0をいれたいので
実際には 0 から 65535 になります。(たぶんあってる)
-もあらわしたいので
65536を2で割ると
32768
つまり、
-1 から -32768
と
1 から 32768
をあらわすことができますが、0もあらわしたいので
-1 から -32768
と
0 から 32767
にしましょう、ってことでは?
結果
-32768 から 32767 になります。
Re:int型の範囲
Posted: 2010年4月18日(日) 23:04
by conio
例えば、3ビットとすると、
値の範囲としては 000 ~ 111 までです。
マイナスが無い場合は最大値は111(10進数の7)になります。
しかし、符号付の場合は
一番左側のビットが1の時はマイナスになります。
よって、最大値は
011(10進数の3)となります。
逆に、負数の最大値(最小値)は
100(10進数の-4)となります。
2の補数での負数の出し方は、
ビットを全部反転し、それに1を足せばOKです。
-------------------------
100 → 011 → 100
-------------------------
で、値を全部書いてみれば分かるように、一番左側が1の場合はマイナスになってしまう以上、
最大値はビット数 - 1となります。
逆に、マイナスの場合は一番左側のビットまで使えるので、
正の数より絶対値が1多い値まで表現できることになります。
-----------------
011 (3)
010 (2)
001 (1)
000 (0)
111 (-1)
110 (-2)
101 (-3)
100 (-4)
-----------------

Re:int型の範囲
Posted: 2010年4月19日(月) 18:41
by hoge
16ビットで表せる数値のパターンは2の16乗個(偶数個)。
偶数だからと言って、正の数と負の数で半分ずつ割り当てたら0が表現できない。
(0は正の数でも負の数でもない)。
逆に0を表現すると、正の数か負の数のどちらかの表現範囲が1つ減ることになる。
通常、数値0には、全てのビットが0である、0000000000000000 を割り当てる。
コンピュータで一般的に使われている「2の補数表現」という負数表現では、
数値の最上位ビットは符号(プラスマイナス)を表す。
最上位ビットが 0 なら正の数、1なら負の数となる。
既に書いたようにゼロのビット列は全てのビットが0。最上位ビットも0。
つまり正の数の取り分のうちの一つがゼロを表現するために奪われた形になる。
だから、正の数の表現範囲は、負の数の表現範囲より1つ少ない。
ちなみに2の補数表現ではコンピュータ特有のオーバーフローする特性を使って負数を表現できる。
16ビットでは、「1 + 0xffff」 がオーバーフローで 0 になる。
1 に足して、0 になるわけだから、0xffffは -1 と同じとみなせる。
同様に 0xfffe は -2、0xfffdは-3となる。
これは16ビットだけじゃなく、何ビットの場合でも当てはまる話です。

Re:int型の範囲
Posted: 2010年4月19日(月) 22:41
by asdf
回答ありがとうございました。お礼が遅くなってしまい申し訳ありません。
おかげでよく分かりました。
また質問させてもらうことがあるかもしれませんが、そのときもよろしくお願いします。
ありがとうございました。