データ型がある理由 メモリ - 萌えJava超入門
第四章 変数・リテラル・データ型

なんでデータ型があるの?

メモリの中で、データ型がどのように扱われているのか、
初心者向けに掘り下げてみます。

なんで?
なんで?
ちょっとめんどい話になるけどいいか?
やっぱりめんどいんだ~。
メモリの中で何が起こっているのか
イメージしてもらえれば十分だ。
若干精度を欠いた表現があるかもしれないが
許してほしい。
また、この時点で完全に理解する必要もない。
気楽に読んでくれ。

目次



1. メモリのイメージ

パソコンの中には、メモリというのが入っています。
パソコン自身が作業するときに使う記憶装置ですね。
メモリは、「メモリセル」と呼ばれる超小さな部屋がたくさん並んだ構造をしています。
メモリセル 1こを、1bit(ビット)といいます。
人間は、メモリセルが電子を溜めている状態と、溜めていない状態を、「0と1」という風に表現します。
それでメモリセルは、「0」又は「1」を1つだけ記憶できるというわけです。

2. 人間界の2進数

0と1で表現した数値を、2進数といいます。
2進数でも、10進数と同じく、小数点やマイナス、指数表現ができます。
人間界の2進数
10進数     普通の2進数
-------------------
-2    -->   -10
-1    -->    -1
 0    -->     0
 1    -->     1
 2    -->    10
 3    -->    11
 4    -->   100
 5    -->   101
 6    -->   110
 7    -->   111
 0.625 -->    0.101



3. メモリの中の2進数

Javaでは、8bit を、データの最小単位としています。
この枠を byte(バイト)といいます。
8bit = 1byte

これはパソコンの仕様に関係しているので、たいていのプログラム言語は、8bit = 1byte です。
10進数の7を、2進数8bit で表現すると、「00000111」のように、0埋めされます。
(メモリセルには、0と1のどちらかが必ず入ります。)
2進数の8bit で表現できるのは 256通りです。

2進数の0埋め
10進数     2進数(8bit)
----------------------
 0   -->   0000 0000
 1   -->   0000 0001
 2   -->   0000 0010
 3   -->   0000 0011
 4   -->   0000 0100
 5   -->   0000 0101
 6   -->   0000 0110
 7   -->   0000 0111
 .   -->     .
 .   -->     .
 .   -->     .
 .   -->     .
 254 -->   1111 1110
 255 -->   1111 1111

それ以上大きな値を表す場合には、隣の枠も使います。

メモリと範囲
bit数byte数範囲
810~255
1620~65535
3240~4294967295
6480~18446744073709551615




4.表現できない値

もうお気づきかもしれませんが、この方法で表現できるのは0以上の整数に限られます。
マイナス、小数、文字 は表現できません。
そこで「データ型」が登場するのです。
データ型ごとに仕様を決めて、 マイナス小数文字 を、デジタル表現したとゆうわけです。



5.メモリの中の整数型

intなどの整数型は、マイナスの値をデジタル表現しています。
Javaの整数型は、すべて符号付(マイナスあり)のデータ型です。

整数型
「2の補数表現」を使って表現しています。(詳細はスルー)
メモリの一番左のbitが1だと、マイナスになります。



6.メモリの中の実数型(浮動小数点型)

float、doubleは、マイナスと、小数 をデジタル表現しています。

実数型(浮動小数点型)
2進数の指数表記にして「符号部」「指数部」「仮数部」それぞれの値を、
決められたメモリ領域に割り当てます。


浮動小数点型 - floatの構造
浮動小数点型 - floatの構造


浮動小数点型のビットレイアウト
型名符号部指数部仮数部合計
float1bit 8bit23bit32bit
double1bit11bit52bit64bit

floatは、合計で32bit(4byte)です。
doubleは、合計で64bit(8byte)です。

浮動小数点型のビットレイアウトは、こちらにも掲載しています
  Java超入門
    よく使いそうな資料一覧 浮動小数点型のビットレイアウト



7.メモリの中の文字

char、Stringは、文字 をデジタル表現しています。

charは、1文字を表わすデータ型です。
文字には1つ1つに、「文字コード」と呼ばれる整数の番号が付いていて、
内部的には文字コードで処理されています。
最も基本的な文字コードである「ASCIIコード」をご覧いただくと、イメージが湧くかもしれません。

ご参照 ↓
  Java超入門
    よく使いそうな資料一覧 ASCIIコード表

文字コードには様々な種類がありますが、Javaでは Unicode(エンコーディング UTF-16)が採用されています。

文字
 UTF-16 で表した文字コード(0~65535の整数)で処理しています。

Stringは、文字列を表わすデータ型です。(Stringは、クラス型に分類されるデータ型です。)
内部的には、charの配列として処理されています。
配列は、同じデータ型の複数の値を、連続したメモリで管理する仕組みです。



8.まとめ

そんなわけで、メモリーの中では、すべてが数値として扱われています。
「データ型」かわからなくなると大変なんです。
Javaはデータ型の指定を、人間側のコーディングに委ねている言語なのです。






© 2019 awasekagami