第四章 変数・リテラル・データ型
なんでデータ型があるの?
メモリの中で、データ型がどのように扱われているのか、
初心者向けに掘り下げてみます。
なんで?
なんで?
ちょっとめんどい話になるけどいいか?
やっぱりめんどいんだ~。
メモリの中で何が起こっているのか
イメージしてもらえれば十分だ。
若干精度を欠いた表現があるかもしれないが
許してほしい。
また、この時点で完全に理解する必要もない。
気楽に読んでくれ。
目次
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数 | 範囲 |
| 8 | 1 | 0~255 |
| 16 | 2 | 0~65535 |
| 32 | 4 | 0~4294967295 |
| 64 | 8 | 0~18446744073709551615 |
4.表現できない値
もうお気づきかもしれませんが、この方法で表現できるのは0以上の整数に限られます。
マイナス、小数、文字 は表現できません。
そこで「データ型」が登場するのです。
データ型ごとに仕様を決めて、
マイナス、小数、文字
を、デジタル表現したとゆうわけです。
5.メモリの中の整数型
intなどの整数型は、マイナスの値をデジタル表現しています。
Javaの整数型は、すべて符号付(マイナスあり)のデータ型です。
整数型
「2の補数表現」を使って表現しています。(詳細はスルー)
メモリの一番左のbitが1だと、マイナスになります。
6.メモリの中の実数型(浮動小数点型)
float、doubleは、マイナスと、小数 をデジタル表現しています。
実数型(浮動小数点型)
2進数の指数表記にして「符号部」「指数部」「仮数部」それぞれの値を、
決められたメモリ領域に割り当てます。
浮動小数点型 - floatの構造
浮動小数点型のビットレイアウト
| 型名 | 符号部 | 指数部 | 仮数部 | 合計 |
| float | 1bit | 8bit | 23bit | 32bit |
| double | 1bit | 11bit | 52bit | 64bit |
floatは、合計で32bit(4byte)です。
doubleは、合計で64bit(8byte)です。
7.メモリの中の文字
char、Stringは、文字 をデジタル表現しています。
charは、1文字を表わすデータ型です。
文字には1つ1つに、「文字コード」と呼ばれる整数の番号が付いていて、
内部的には文字コードで処理されています。
最も基本的な文字コードである「ASCIIコード」をご覧いただくと、イメージが湧くかもしれません。
ご参照 ↓
Java超入門
よく使いそうな資料一覧 ASCIIコード表
文字コードには様々な種類がありますが、Javaでは Unicode(エンコーディング UTF-16)が採用されています。
文字
UTF-16 で表した文字コード(0~65535の整数)で処理しています。
Stringは、文字列を表わすデータ型です。(Stringは、クラス型に分類されるデータ型です。)
内部的には、charの配列として処理されています。
8.まとめ
そんなわけで、メモリーの中では、すべてが数値として扱われています。
「データ型」かわからなくなると大変なんです。
Javaはデータ型の指定を、人間側のコーディングに委ねている言語なのです。