静岡理工科大学 菅沼ホーム 全体目次 演習解答例 付録 索引

第Ⅰ部

第1章 コンピュータ入門

  1. 1.1 コンピュータの構造と動作
  2. 1.2 情報の表現
    1. 1.2.1 2 進数
    2. 1.2.2 10 進数から 2 進数への変換
    3. 1.2.3 数値の表現
      1. 1.2.3.1 整数の表現
      2. 1.2.3.2 浮動小数の表現
    4. 1.2.4 文字の表現
  3. 演習問題1

1.1 コンピュータの構造と動作

  コンピュータは,図 1.1 に示すように,全体の制御や演算を行う中央処理装置( Central Processing Unit,通常,CPU という),実行すべきプログラムやデータを記憶する主記憶装置(メモリ,main memory ),人間とコンピュータとの会話を司る入出力装置(キーボード,ディスプレイ,マウス等),及び,作成されたプログラムやデータを保存しておく補助記憶装置(ハードディスク,USB メモリ,CD-ROM 等)からなっています.

  コンピュータで扱うすべての情報(命令,データ)は,0 と 1 の 2 つの状態(をとる要素)の組み合わせによって記述されます.0 と 1 のいずれかの値からなる要素の n 個の並び(ビット列)の長さを n ビットbit )であるといいます.通常,8 ビットを基準とすることが多く,8 ビットを 1 バイトbyte )と呼びます.また,さらに長いビット列の長さを表現するため,
	1024 バイト   = 1キロバイト(KB)   注:1024 = 210
	1024 キロバイト = 1メガバイト(MB)
	1024 メガバイト = 1ギガバイト(GB)
	1024 ギガバイト = 1テラバイト(TB)
		
などの単位が使用されます.

  また,記憶装置の場所を指定するため,記憶装置には,通常バイトを単位として,番地アドレスaddress )が割り当てられています.つまり,最初の 1 バイト目を 0 番地,2 バイト目を 1 番地といった方法です.

  次に,コンピュータの動作について簡単に説明します.まず,実行すべきプログラムが主記憶装置のある番地に読み込まれ記憶されます.もちろん,このとき,プログラムやデータは 0 と 1 のビット列で,つまり,機械語で記述されている必要があります.次に,プログラムカウンタにプログラムの開始位置の番地が設定されます.以下,次のような手順でプログラムが実行されていきます.

  1. プログラムカウンタに設定された命令を読む
  2. 命令を解読する
  3. 命令を実行する
  4. プログラムカウンタの値を次の命令のアドレスに設定し,1)へ戻る

  命令は,様々な方法で記述され,また,その長さもまちまちですが(ただし,バイトの倍数),例えば 2 つの数値を加える命令

ADD A B  ( A 番地の内容と B 番地の内容を加え結果を A 番地に記憶)

は以下のような方法で記述されます.

命令コード A 番地指定用オペランド B 番地指定用オペランド

  もし,この命令の長さが 5 バイトであり,かつ,その番地が 20 番地であったとします.プログラムカウンタが 20 に設定されこの命令が実行されると,プログラムカウンタの値は自動的に次の命令の番地である 25( 20 + 5 )に設定されます.この命令のように,実行した命令が実行順序を変更するような命令でなければ,プログラムカウンタの値は,現在の番地に実行した命令の長さが加えられた値に設定され,設定されたアドレスにある命令が実行されます.また,ジャンプ命令のように,次に実行する命令を指定するような命令の場合は,指定された命令のアドレスをプログラムカウンタに設定し,その命令を実行することになります.このようにして,実行停止の命令に到達するまで,次々にプログラム内の命令が実行されていきます.

1.2 情報の表現

1.2.1 2 進数

  我々は,通常,数値を表すのに 10 進数を使用します.10 進数では,0 から 9 までの 10 個の記号を使用し,各桁はその桁に対応した 10 のベキ乗の重みを持っています.例えば,365 や 3.14 は,以下のような意味を持っています.
	365  = 3*102 + 6*101 + 5*100
	3.14 = 3*100 + 1*10-1 + 4*10-2
		
  コンピュータでよく使用される 2 進法binary )は,0 と 1 の記号だけを使用した数値表現方法です.一般に,bnbn-1・・・b1b0.c1c2・・・cmと書かれ,その意味するところは以下の通りです.
	bn*2n + bn-1*2n-1 + ・・・ + b1*21 + b0*20 + c1*2-1 + c2*2-2 + ・・・ + cm*2-m
		bi,cj: 0 または 1
例えば,10 進数の 6,17,0.25,3.625 は,2 進数では以下のように表現されます.
	6     = 4 + 2 = 1*22 + 1*21 + 0*20 = 110
	17    = 16 + 1 = 1*24 + 0*23 + 0*22 + 0*21 + 1*20 = 10001
	0.25  = 0*20 + 0*2-1 + 1*2-2 = 0.01
	3.625 = 2 + 1 + 0.5 + 0.125 = 1*21 + 1*20 + 1*2-1 + 0*2-2 + 1*2-3 = 11.101
		
  大きな数字を 2 進数で表現すると,桁数が非常に長くなります.この点を避けるため, 8 進法octal )や 16 進法hexadecimal )もよく使用されます.8 進数は 0 から 7 までの記号を,また,16 進数は 0 から 9 までに加えて A,B,C,D,E,および,F(または,a,b,c,d,e,および,f )が使用されます.各桁の重みが,それぞれ,8 のベキ乗及び 16 のベキ乗である点を除いて,2 進数や 10 進数と考え方は同じです.

  なお,表現されている数字が何進数かを明確に表現するため,下の例のように,数字の右下に小さく何進数かを表す数字を書くことがあります.

(246)8 (101)10 (101)2

1.2.2 10 進数から 2 進数への変換

  2 進数から 10 進数へ変換するには,その定義に従って,各桁の数字と対応した 2 のベキ乗をかけたものを加えていけば可能です.しかし,10 進数から 2 進数への変換は,多少面倒です.そこで,以下に述べるような方法がよく使われます.

  まず,整数に対しては,次の例のように,与えられた 10 進数を 2 で順に割っていき,各割り算における余りを求めるという方法が簡単です.
	例:10 進数 26 を 2 進数へ変換
		2)26
		2)13	 ・・・ 余り 0 = a0
		2) 6	 ・・・ 余り 1 = a1
		2) 3	 ・・・ 余り 0 = a2
		2) 1	 ・・・ 余り 1 = a3
		   0	 ・・・ 余り 1 = a4
			(26)10 = (a4a3a2a1a0)2 = (11010)2
		
  小数点以下の数値に対しては,次の例のように,2 を順に乗じていき,その 1 の桁を 2 進数として採用していく方法があります.
	例:10 進数 0.1 を 2 進数へ変換
		0.1×2=0.2 ・・・ 0   小数点以下 1 桁目
		0.2×2=0.4 ・・・ 0   小数点以下 2 桁目
		0.4×2=0.8 ・・・ 0   小数点以下 3 桁目
		0.8×2=1.6 ・・・ 1   小数点以下 4 桁目
		0.6×2=1.2 ・・・ 1   小数点以下 5 桁目
		0.2×2=0.4 ・・・ 0   小数点以下 6 桁目
		  ・・・・・
			(0.1)10 = (0.000110・・・)2
		
  この例からも明らかなように,10 進数における小数点数を 2 進数に変換すると循環小数になってしまうような場合があります.この点は非常に重要です.データをコンピュータに記憶させる場合,必ず 2 進数に変換されます.しかし,コンピュータに記憶できる桁数には制限があります.従って,循環小数になってしまうような場合,途中で打ち切らざるを得ません.つまり,上の例の場合,10 進数の 0.1 とコンピュータが内部に記憶している 0.1 に対応する数字は厳密には等しくないことになります.今後プログラムを書く場合において,人間が紙の上で行う計算と,コンピュータ内部で行われる計算とが必ずしも同じ結果に至らないという点に十分注意する必要があります.

  いったん 2 進数に変換されれば,8 進数や 16 進数への変換は非常に簡単です.下の例のように,下位の桁から 3 ビットずつ,または,4 ビットずつ区切り,それぞれを,0 から 7,または,0 から F に書き換えてやれば,8 進数または 16 進数に変換できます.
	例:(1111010111010011)2
		8 進数  1 111 010 111 010 011 → (172723)8
		16 進数    1111 0101 1101 0011 → (F5D3)16
		
1.2.3 数値の表現

1.2.3.1 整数の表現

  通常,整数は 1 バイト( 8 ビット),2 バイト( 16 ビット),4 バイト( 32 ビット),8 バイト( 64 ビット)等で表現されます.その表現方法は,先に述べた 2 進数の表現方法と基本的に同じです.ただし,図 1.2 に示すように最上位のビットは符号ビットとして使用されます( 0 が正,1 が負を表す.なお,符号ビットを使用しない表現方法も存在する.)ので,例えば,n ビットを使用する場合,正の整数であれば,0~2n-1-1までの値を表現可能になります.例えば,8 ビットで表現する場合,10 進数の 3 は,00000011 となります.

  負の整数の表現には注意する必要があります.通常,減算が加算により実行できることから,コンピュータでは 2 の補数表現がよく使用されます.2 の補数は,2 進数の 0 と 1 とを反転し,最下位の桁に 1 を加えたものになります.従って,10 進数の -3 に対する内部表現は,10000011 とはならず,11111101 となります.

1.2.3.2 浮動小数点数の表現

  例えば,0.1245×10-23 のように,小数点を持つ数字,浮動小数点数 N(数学でいう,実数に対応)は,一般に,

N = M × RE    M:仮数, R:基数, E:指数

の形で表現できます.コンピュータにおいても,通常,4 バイトまたは 8 バイトを使用して,図 1.3 のように表現されます.符号ビットは,全体の符号を示し,0 なら正,1 なら負です.指数の符号は,指数部に含まれます.また,基数としては,2 や 16 が使用されます.浮動小数点数で数値を表現した場合,仮数部のビット数でその数の有効桁数が決まります.浮動小数点数 を 4 バイトで表現した場合,その有効桁数は 7 桁程度,8 バイトで表現した場合は 15 桁程度です.

  プログラミングの場合,通常,小数点がない数字は整数として,また,小数点がある数字は浮動小数点数として内部表現されます.したがって,普段の計算においては,3 と 3.0 はほとんど同じ意味に使用されますが,コンピュータ内部においてはその表現形式が全く異なります.同じバイト数を使用しても,そのビット列は全く異なることになります.

1.2.4 文字の表現

  コンピュータ内部では,文字もビット列で表します.従って,どのようなビット列が何という文字に対応しているかの約束事が必要になります.このような約束事を文字コードと呼びます.英米で使用されるのはアルファベット,数字,何種類かの記号だけですので,8 ビット( 256 種類の文字を表現可能)で 1 文字を表せば十分ですが,日本語の場合,漢字があるため 2 バイトで 1 文字を表す文字コードを使用する必要があります.

  すべてのコンピュータで同じ文字コードを使用していれば問題ないのですが,以下に示すように,様々な文字コードが存在します.従って,異なるコンピュータで同じプログラムやデータを使用したい場合は,場合によってはコード変換を行う必要があります.

ASCII(アスキーコード,1バイト)
EBCDIC(1バイト)
JIS,シフトJIS(1バイト,2バイト)
EUC(2バイト)
Unicode(2バイト,ユニコード)

  以上述べたように,コンピュータ内部では,命令,数値,文字等がすべてビット列で表現されます.各表現のそれぞれに,それが何を表しているのかを示す指標が付加されているわけではありません.従って,同じビット列をコンピュータがどのように解釈するかによって様々な結果となります.例えば 0110001101100100 というビット列は,2 バイトで表現された整数として解釈されれば,10 進数の 25444 になりますし,ASCII コードを使用した文字列として解釈すれば,"cd" になります.同様に,浮動小数点数の一部として解釈すれば,上の数字とは全く異なるものになります.

演習問題1

[問1]次の 10 進数を 2 進数に変換せよ.
(1)(0.25)10
(2)(0.34)10

[問2]次の 10 進数を 1 バイトの 2 進数,8 進数,及び,16 進数で表現せよ.なお,負の数に対して 2 の補数表現を使用するものとする.
(1)(56)10
(2)(23)10
(3)(34)10
(4)(-34)10
(5)(-25)10

[問3]次の 2 進数,及び,16 進数を 10 進数で表現せよ.ただし,負の数に対しては,2 の補数表現が使用されているものとする.
(1)(00100111)2
(2)(11110001)2
(3)(3F)16
(4)(FD)16

[問4]次の文字及び記号を 2 進数及び 16 進数を使用して,ASCIIコードで表現せよ
(1)B
(2)x
(3)=

静岡理工科大学 菅沼ホーム 全体目次 演習解答例 付録 索引