🍣

ITスクールの授業3日目のまとめ :進数とアスキーコード(ASCII CODE)&ユニコード

2023/07/18に公開

前書き

人間は日常生活で数字を10進数で扱っている。しかし、コンピューターは数字を0と1しか分からなくて、実際にプログラマーが入力した10進数も2進数に変換して演算などをする。

そのため、プログラマーはコンピューターが2進数の数字をどう扱って処理するかを知る必要がある。今回はコンピューターのデータの単位であるビット及びバイトを2進数でどう表すかを主に調べて、共に文字型である「char」型がどう文字を扱うかを調べる。


プログラミングで使う進数の種類

プログラミングで使われる進数は下記のようである。

  1. 10進数:人間が日常生活で1番よく使う進数。0~9までの数を通じて数字を表示する。
    EX) -7、15、33、10

  2. 2進数:コンピューターが使える唯一の進数。0と1だけを表示できる。コンピューターが扱うデータの最小単位である「びっと(bit)」は、この0とか1の値を1つ持ってる単位である。コンピューターはそのびっとが8つ揃ったバイト(byte)に書かれてある0と1だけを演算して全ての数を扱う。
    EX)1101、11100011、000000000000000000000000000001101

  3. 8進数:0~7までの数を使って数字を表示する。2進数の数字が長いので、8進数に変換するともっと短い数字で表示することができる。
    変換の仕方:2進数の数字を3つづつ分けて、分けた2進数を8進数に変える。
    EX)11100011->343、11011011111->3337。

  4. 16進数:0~9まで、またA~Fまで使って数字を表示する。16進数も長い2進数表示を短くするために使う。
    変換の仕方:2進数の数字を4つづつ分けて、分けた2進数を16進数に変える。
    EX)1101010010111011ー>D4BB、1111111111111111ー>FFFF

コンピューターの2進数の扱い方:負数はどう表現するのか

上記の通り、コンピューターは数字を0と1という2進数しか扱わない。ならば、コンピューターの内部で、私たちが代入したデータはどう変換されているのだろう?

とりあえず、コンピューターはユーザーがあるデータ型で10進数を入力すると、データ型によるメモリー空間に、10進数を2進数に変換して覚える。

int a = 5; // int型の容量のメモリー(4byte)で、2進数に変換する。
//結果 --> 00000000 00000000 00000000 00000101

さらに知っておくべきことは、2進数で負数も表示しないといけないということだ。そのため、2進数数字の一番左の(最上にもなる)値によって、その数が負数か正数かを決める。

負数を「‐」を付けて表せないという特徴で、10進数では正数を負数に変えるには「-」を付けると終わるが、2進数では「2の補数計算」を通じて変えないといけない。詳しい変換の仕方は下記のURLを見てみよう。

https://talosta.hatenablog.com/entry/husuhyogen

実数も2進数で表現しなければならない。しかし、実数は整数と異なって、小数を表そうとすれば決まってあるデータ型の容量では少ない範囲しか表現ができない。そのせいで、実数を2進数に表現する時は「浮動小数点」という形式で表すす。詳しい説明は下記のURLを見てみよう。

https://wa3.i-3-i.info/word14959.html

文字型は内部でどのように扱われるかーアスキーコード(ASCII CODE)、ユニコード(UNICODE)

文字型のデータ型も、変数に文字を入力するように見えるが、内部では2進数の数字で入力される。そのせいで、文字型の変数にある範囲の整数を入力してもエラーが発生しない。

char A = 65;
System.out.println(A); 
//エラーが発生せず、文字「A」が出力する。

文字型は、内部的には2byteの正数になっており、出力をする時にその数字に1対1に対応する文字に変換して見せることである。

その正数ー文字を1対1対応させる規則がアスキーコードとユニコードである。もともとアスキーコードがあったが、もっと多い文字を変換するためにユニコードが作られた。

上の「A]はアスキーコード上で「65」に対応するので、65が入力できて、出力すると65に対応する「A」と表現されることである。

WEB開発をすると、あのアスキーコードやユニコードを知っておく方がいいと先生がおっしゃった。理由は後でわかると思う。


以上で、コンピューターが2進数を内部でどのように扱うかを調べてみた。人間は日常で2進数を使わないので、初めて0と1の並べを見ているとすごい難しいと思うが、だんだん慣れないといけないことがすこしは分かった気がする。

次は、コード上でデータを入力するのでなく、プログラムを実行してからデータを入力する方法、「Scanner」を調べてみる予定である。

Discussion