整数型の最大値はどのように決まるのか? 意外と知らないbitの仕組み

intは-2147483648~2147483647の範囲というのはggればすぐに出てきますが
それは”なぜ”なのか知っていますか?

「〇〇型だからこの範囲」ではなく、もう少し掘り下げた部分について書いていきます!



整数型

intなどの整数型には最大値と最小値があります

Java, C#, C/C++ 等の静的型付け言語では
値の範囲がビット数に基づいて決められています。

Java

byte 8ビット -128 ~ 127
short 16ビット -32,768 ~ 32,767
int 32ビット -2,147,483,648 ~ 2,147,483,647
long 64ビット -9223372036854775808 ~ 9223372036854775807

 

C#

sbyte 8ビット -128 ~ 127
byte 8ビット 0 ~ 255
short 16ビット -32,768 ~ 32,767
ushort 16ビット 0 ~ 65,535
int 32ビット -2,147,483,648 ~ 2,147,483,647
uint 32ビット 0 ~ 4,294,967,295
long 64ビット -9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807
ulong 64ビット 0 ~ 18,446,744,073,709,551,615

c#には符号なしの整数型も用意されています!

新米太郎
新米太郎

ulongなんて、とんでもない数ですね、、

C/C++

cの場合はコンパイラによって定義しているビット数が異なるようです。

8, 16bit のマイコンだったり、64bitのPCで動いていたりするので
取りうるbit数が固定では無いらしい、、

私自身はC/C++に詳しくないので、割愛します。

bit数と範囲

intでは数が大きくて考えると大変なので、8bitで考えることにします。
(Javaならbyte型、C#ならsbyte型で、他の言語でも8bitの整数型は有るはずです)

8bitでは-128~127 となっていますが

なぜ-128~127と決まっているのでしょうか?

感の良い方なら
2の8乗 = 256 だからだと気づくかもしれません。

-128~-1 = 128個
0~127 = 128個

で合計256になるため、-128~127となります。

8bitが2の8乗で256通りって言われても
何やねん!!!

となる人も居るでしょう
次はbitについて説明していきます。

 

bitとは

コンピュータの内部では
電圧が在れば1、無ければ0といった具合に2通りでしか表せないのです。

1bitなら0と1を表現できる枠が一つ ということになります。

1bit
0
1

2通り
(2^1)

2bit
00
01
10
11

2 × 2 = 4通り
(2^2)

3bit
000
001
010
011
100
101
110
111

2 × 2 × 2 = 8通り
(2^3)

としていくと、0と1の2つ ^ bit数 が組み合わせの数だと分かりますね!

8bitだと 2^8で256通りになります

 

マイナスの表し方

ここでは更に数を小さくし簡単に、4bitで考えてみます。

4bitを2進数で表した場合
0000~1111

となり、マイナス(負数)がありませんが
どうやって表しているのでしょうか?

2の補数という方法で表現していて、下の表のようになります。

10進数 2進数
−8 1000
−7 1001
−6 1010
−5 1011
−4 1100
−3 1101
−2 1110
−1 1111
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111

他にも

  • 符号と絶対値
  • 1の補数

と言われる表現方法もあるのですが、+0と-0が出てしまったり
2の補数の方が演算が簡単だったりと問題があるため、2の補数がコンピュータの世界ではよく使われています。

最後に

今回は直接的なプログラミングの話ではなく、コンピュータの考え方によった話なりましたが
知っておくとプログラミングへの理解も深まると思います。

お読み頂きありがとうございました!



コメント

タイトルとURLをコピーしました