目次 | 索引 |
---|---|
前回、情報科学は情報の構造や処理に関する学問であると言いました。 今日は、その第一歩として、コンピュータの内部では、データはどのように表現されるのかについて説明します。
コンピュータが扱うデータの単位はビットです。 ビット ( bit )とは、2種類の区別できる物理量や概念、記号のことです。 例えば、物理量では電圧の有無、概念では真偽、記号では0と1がビットです。
コンピュータの内部では、データはすべてビットの列によって表現されます。 このビットの列による表現は、 2進符号 ( binary code )と呼ばれます。
なお、ビットはデータの単位としては小さすぎて扱いにくいですので、通常のシステムでは、バイトをデータの単位とします。 バイト ( byte )とは、8ビットのまとまりのことです。
コンピュータの扱うデータの中では、数値、特に整数が重要です。 ここでは、整数の2進符号について説明します。
例えば、整数のつもりで 123 と書きますと、これは 1 × 100 + 2 × 10 + 3 × 1 という値を持ちます。 100の位の数字が100の重さを持ち、10の位の数字が10の重さを持ち、1の位の数字が1の重さを持つのです。 このように、数字の位置に応じて重さを変える、数値の表記法を、 位取り ( positional notation )と呼びます。 そして、重さが10倍10倍であることを、この位取りの 基数 ( radix )は10であると言います。
基数10の位取りによって表現された数を 10進数 ( decimal number )と呼びます。 基数2の場合は 2進数 ( binary number )、基数8の場合は 8進数 ( octal number )、基数16の場合は 16進数 ( hexadecimal number )です。
10進数は、0から9までの10種類の数字を使って表現されます。 それに対して、2進数は0と1の2種類です。 2進数では、右から1の位、2の位、4の位、8の位、…となります。
普通のシステムでは、整数の2進符号として2進数を用います。 つまり 、0と1による位取りをビットの列に対応させます。 桁数が足りなければ、左側に0を追加します。 10進数と2進数、2進符号の対応は次の通りです。
10進数 | 2進数 | 2進符号(1バイト) |
---|---|---|
0 | 0 | 0000 0000 |
1 | 1 | 0000 0001 |
2 | 10 | 0000 0010 |
3 | 11 | 0000 0011 |
4 | 100 | 0000 0100 |
8進数は、数字0から7までを使って表現されます。 16進数は、数字0から9までと、英字AからFまでを使って表現されます。 英字については、A は 10, B は 11, C は 12, D は 13, E は 14, F は 15 です。
なお、このような文脈で単に20と書きますと、これが10進数なのか8進数なのか16進数なのか分からなくなります。 この混乱を避けるため、8進数を表すときは左側に0を追加する慣習があります。 この慣習に従いますと、020は10進数で16になります。 16進数の場合は、左側に0xを追加します。 すると、0x20は10進数で32になります。
ここで、10進数、2進数、および16進数を相互に変換する方法について説明します。 10進2進の相互変換と2進16進の相互変換ができれば、すべての変換ができます。
2進数を16進数に変換するには、次のようにします。
2進数 | 16進数 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | A |
1011 | B |
1100 | C |
1101 | D |
1110 | E |
1111 | F |
16進数を2進数に変換するには、表の逆方向に置き換えます。
10進を2進数に変換するには、次のようにします。
例題1. 10進数 58 を1バイトの16進数に変換してください。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。
解答例1. 10進数を2進数に変換してから16進数に変換します。
2進数 111010 を1バイトにすると 00111010 となり、これは16進数で 0x3a です。 したがって、10進数 58 は16進数で 0x3a です。
2進10進変換 ( binary-to-decimal conversion )
2進数を10進数に変換するには、次のようにします。
例題2. 16進数 0x28 を10進数に変換してください。 始めに手計算で変換し、次にバイナリ・ファイルEx2.classを変更してjavaコマンドを実行し、出力を確認します。
解答例2. 16進数を2進数に変換してから10進数に変換します。 16進数 0x28 は2進数で 0010 1000, すなわち 101000 です。
したがって、16進数 0x28 は10進数で 40 です。
2進数の四則演算は、10進数の場合と同様に行います。 ただし、繰り上げと繰り下げには注意が必要です。 例えば足し算ならば、10進数の場合は10以上で繰り上げましたが、2進数の場合は2以上で繰り上げます。
例題3. 10進数の足し算 50 + 29 = 79 を2進数で行ってください。 始めに 50 と 29 を2進数に変換し、2進数の足し算を行った後、結果を10進数に変換します。
解答例3.
10進数 50 は2進数で 110010 です。
10進数 29 は2進数で 11101 です。
11 0010 + 1 1101 ----------- 100 1111
和は2進数で 1001111 です。
2進数 1001111 は10進数で 79 です。
10進数では、負数は -3 のように符号(-)と絶対値(3)を組み合わせて表現します。 2進数で負数を表現する方法には、絶対値表現と補数表現があります。 絶対値表現 ( sign and magnitude notation )は、符号ビットと負数の絶対値を組み合わせるものです。 補数表現 ( complement notation )には、1の補数と2の補数があります。 1の補数 ( 1's complement )とは、絶対値の2進数(1バイトならば左に0を追加して8桁にする)のすべてのビットを反転させたものです。 2の補数 ( 2's complement )とは、1の補数に1を足したものです。 通常のシステムでは2の補数が使われます。
例題4. 10進数 -20 を1バイトの16進数に変換してください。 負数の表現は2の補数を用います。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。
解答例4.
10進数 -20 の絶対値 20 を2進数に変換します。
2進数 10100 を1バイトにすると 0001 0100 です。
0001 0100 1110 1011(1の補数) 1110 1100(2の補数)
したがって、10進数 -20 は16進数で 0xec です。
2の補数の利点は、整数の符号を気にせずに四則演算が行えることです。 1バイトの足し算なら、8桁を越える部分を無視すれば、負数でも正しく計算ができます。 なお、計算結果の桁数が越えることを オーバーフロー ( overflow )と言います。
例題5. 10進数の足し算 49 + -11 = 38 を2進数で行ってください。 負数の表現は2の補数を用います。 始めに 49 と -11 を1バイトの2進数に変換し、2進数の足し算を行った後、和を10進数に変換します。
解答例5.
10進数 49 は2進数で 110001 です。
0000 1011(1バイト) 1111 0100(1の補数) 1111 0101(2の補数)
10進数 -11 は2進数で 11110101 です。
11 0001 + 1111 0101 ----------- 1 0010 0110
和の、右から9桁目以上を取り除いた2進数 100110 を、10進数に変換します。
2進数 100110 は10進数で 38 です。
問1. 10進数 77 を1バイトの16進数に変換してください。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。
問2. 16進数 0x5b を10進数に変換してください。 始めに手計算で変換し、次にバイナリ・ファイルEx2.classを変更してjavaコマンドを実行し、出力を確認します。
問3. 10進数の足し算 54 + 22 = 76 を2進数で行ってください。 始めに 54 と 22 を2進数に変換し、2進数の足し算を行った後、結果を10進数に変換します。
問4. 10進数 -35 を1バイトの16進数に変換してください。 負数の表現は2の補数を用います。 始めに手計算で変換し、次にプログラムEx2.javaを変更してjavacコマンドを実行し、バイナリ・ファイルEx2.classの内容を確認します。
問5. 10進数の足し算 43 + -17 = 26 を2進数で行ってください。 負数の表現は2の補数を用います。 始めに 43 と -17 を1バイトの2進数に変換し、2進数の足し算を行った後、和を10進数に変換します。
今日の演習2の答案をkonishi@twcu.ac.jpあてにメールで送ってください。 メールには、学生番号、氏名、科目名、授業日(10月1日)を明記してください。