コンピュータにおける 数値表現と演算(1)

コンピュータにおける
数値表現と演算(1)
1. 2進数,10進数,16進数
2. 負の数の表現法(2の補数)
(例) 10進表現と値としての解釈
123.45(10) =1×102+2×10+3+4×10-1+5×10-2
100の桁 10の桁 1の桁
0.1の桁
0.01の桁
p進表現(p:基数, base/radix)
an-1an-2an-3・・・a2a1a0 .a-1a-2a-3・・・a-m (p)
= an-1pn-1 + an-2pn-2 +・・・+a2p2+a1p1+a0
+a-1p-1+a-2p-2+・・・+a-mp-m (10)
ただし 0≦ak≦p-1
1
2進数(binary number)
• コンピュータで使われる表現方法(基数2)
1001(2) = 1×23 + 0×22 + 0×21 + 1×20
= 1×8 + 0×4 + 0×2 + 1×1
23の桁
22の桁
21の桁
20の桁
= 9 (10進数 decimal number)
注)
8=2x2x2=23
4=2x2=22
2=21
1=20
bit (binary digit,ビット) : 2進数1桁のこと
1001 は 4bit
10101101 は8bit (1byte)
1011011010100101 は16bit (2byte)
2進整数
1011(2) = 1×23+0×22+1×21+1×20
= 11(10)
0110 1001(2) = 0×27+1×26+1×25+0×24
+1×23+0×22+0×21+1×20
= 0×128+1×64+1×32+0×16
+1×8+0×4+0×2+1×1
= 105 (10)
1110 1000(2) = 1×128+1×64+1×32+0×16
+1×8+0×4+0×2+0×1
= 232 (10)
2
2進小数
10進数
0.356(10) = 3×10-1+5×10-2+6×10-3
= 3×(1/10)+5×(1/100)+6×(1/1000)
2進数
0.1001(2) = 1×2-1+0×2-2+0×2-3+1×2-4
= 1×(1/2)+0×(1/4)+0×(1/8)+1×(1/16)
= 1×0.5+0×0.25+0×0.125+1×0.0625
= 0.5625(10)
2のべき乗
20=1
21=2
22=4
23=8
24=16
25=32
26=64
27=128
28=256
29=512
210=1024
211=2048
212=4096
213=8192
214=16384
215=32768
3
2-1=0.5
2-2=0.25
2-3=0.125
2-4=0.0625
2-5=0.03125
2-6=0.015625
2-7=0.0078125
2-8=0.00390625
2進数⇒10進数(整数)
214 212 210 28
26 24
22 20
215 213 211 29
27 25
23 21
1010 1001 1110 1000(2)
= 1×215+0×214+1×213+0×212
+1×211+0×210+0×29+1×28
+1×27+1×26+1×25+0×24
+1×23+0×22+0×21+0×20
= 32768+8192+2048+256+128+64+32+8
= 43496 (10)
2進数⇒10進数(小数)
0.10011101(2)
= 1×2-1+0×2-2+0×2-3+1×2-4+1×2-5+1×2-6+0×2-7+1×2-8
= 1×(1/2)+0×(1/4)+0×(1/8)+1×(1/16)
+1×(1/32)+1× (1/64)+0×(1/128)+1×(1/256)
= 1× + 0 ×
+ 0×
+ 1×
+ 1×
+1×
+ 0×
+ 1×
=
(10)
4
10進数⇒2進数(整数)
217(10)= 1101 1001(2)
217÷2=108 余り1
108÷2=54 余り0
54÷2=27 余り0
27÷2=13 余り1
13÷2=6 余り1
6÷2=3 余り0
3÷2=1 余り1
1÷2=0 余り1
最下位bit
第1bit
第6bit
最上位bit
10進数⇒2進数(小数)
0.3125 ⇒ 0.0101
①② ③④
①
0.3125x2=0 .625
②
0.625x2=1 .25
③
0.25x2=0 .5
④
0.5x2=1 .0
5
10進→2進変換
(1) 整数部:2で割って,余りを並べる
(2) 小数部:2を掛けて,整数部を並べる
(1) の理由
X(10)=an-12n-1+an-22n-2+‥‥+a222+a121+a0
X (10)÷2=an-12n-2+an-22n-3+‥‥+a221+a1
余り a0
(X(10)÷2)÷2=an-12n-3+an-22n-2+‥‥+a2
‥‥
(2) の理由
余り a1
‥‥
Y(10)=a-12-1+a-22-2+‥‥+a-(n-1)2-(n-1)+a-n2-n
Y(10)×2=a-1+a-22-1+‥‥+a-(n-1)2-(n-2)+a-n2-(n-1)
a-1が整数部
(Y(10)×2)×2=a-2+a-32-1+‥‥+a-(n-1)2-(n-3)+a-n2-(n-2) a-2が整数部
‥‥
‥‥
16進数による表現
2進数
1100 1010 0001 1000 1001 0010 0000 1101
C
A
1
8
9
2
0
D
対応表
16進数
CA18920D(16)
0000=0
0001=1
0010=2
0011=3
0100=4
0101=5
0110=6
0111=7
6
1000=8
1001=9
1010=A
1011=B
1100=C
1101=D
1110=E
1111=F
16進数と2進数の相互変換
16進数⇒2進数
16進数1文字を2進数4bitで置き換える
2進数⇒16進数
2進数4bitを16進数1文字で置き換える
例: A5.F7 (16) ⇔ 1010 0101 . 1111 0111 (2)
10進→16進変換
(1) 整数部:16で割って,余りを並べる
1234(10) = 4D2(16)
1234÷16=77 余り 2
77÷16=4 余り 13 →D
4÷16=0 余り 4
(2) 小数部:16を掛けて,整数部を並べる
0.1234(10) = 0.1F9・・・(16)
0.1234×16=1.9744
0.9744×16=15.5904
0.5904×16=9.4464
・・・
7
整数部 1
整数部 15→F
整数部
9
負の数の表現(2の補数)
符号なし整数(8ビットの場合)
27
26
24
25
22
23
20
21
1 0 0 1 1 0 0 1 (=153)
2の補数表現(8ビットの場合)
最上位ビット(符号ビット)を -27 の重みをもつ桁と考える
26
-27
24
25
22
23
20
21
1 0 0 1 1 0 0 1 (=-128+16+8+1=-103)
注)16bit, 32bit の場合も最上位bitを符号bitと考える。
16bitの場合は最上位bitを-215,32bitの場合は-231と考える。
符号無し整数と符号付整数
8ビットの場合
符号付整数(正負の数)
0000 0000 =0
0000 0001 =1
:
正の数
:
0111 1110 =126
0111 1111 =127
1000 0000 =-128
1000 0001 =-127
:
負の数
:
1111 1101 =-3
1111 1110 =-2
1111 1111 =-1
符号無し整数(正の数)
0000 0000 =0
0000 0001 =1
:
:
0111 1110 =126
0111 1111 =127
正の数
1000 0000 =128
1000 0001 =129
:
:
1111 1101 =253
1111 1110 =254
1111 1111 =255
8
符号付整数(32bitの場合)
0000 0000 0000 0000 0000 0000 0000 0000 = 0
0000 0000 0000 0000 0000 0000 0000 0001 = 1
:
:
0111 1111 1111 1111 1111 1111 1111 1110 = 2,147,483,646
0111 1111 1111 1111 1111 1111 1111 1111 = 2,147,483,647
(=231-1)
1000 0000 0000 0000 0000 0000 0000 0000 =-2,147,483,648
(=-231)
1000 0000 0000 0000 0000 0000 0000 0001 =-2,147,483,647
:
:
1111 1111 1111 1111 1111 1111 1111 1110 =-2
1111 1111 1111 1111 1111 1111 1111 1111 =-1
2の補数の求め方(1)
◆ 方法1:2n から引く (n:表現するビット数)
8ビットの場合
例:-25の求め方
28から25を引く (n ビットの場合は 2n から引く)
1 0000 0000 (=28=256)
-) 0001 1001 (=25)
1110 0111 (= -25)
注)この計算は0から25を引いているとも考えられる
9
2の補数の求め方(2)
◆ 方法2:ビットを反転して,最下位ビットに 1 を足す
例:-25の表現
25 = 0001 1001
ビット反転
1110 0110 最下位ビットに1を
+)0000 0001 足す
1110 0111 (= -25)
検算:
ビット反転
再度、ビット反転と
1の加算で元に戻る
-(-X) = X
0001 1000 最下位ビットに1を
+)0000 0001 足す
0001 1001 (= 25)
2の補数の求め方(3)
32bitの場合
注)ビット長に関わらず求め方は同じ
例:-165の表現
0000 0000 0000 0000 0000 0000 1010 0101 (=165)
ビット反転
1111 1111 1111 1111 1111 1111 0101 1010 最下位ビット
+) 0000 0000 0000 0000 0000 0000 0000 0001 に1を足す
1111 1111 1111 1111 1111 1111 0101 1011 (= -165)
符号bit
10
2の補数表現⇒10進数(整数の場合)
8bitの場合
方法1:1110 0101に対応する10進数
= -27+26+25+22+20
= -128+64+32+4+1= -27
方法2:1110 0101に対応する10進数
0001 1010
ビット反転
+) 0000 0001 最下位ビットに1を足す
0001 1011 (= 27)
ビット反転と1の加算
で元に戻る
-(-X) = X
もとの数は -27
2の補数表現⇒10進数(小数を含む場合)
コンピュータにおける補数表現は小数点の位置には無関係
例題:1110 0101 を符号ビットを含めて整数部4ビット,小数部4ビッ
トの数値(1110.0101)とみなしたときの10進数値はいくらか ?
方法1:1110 0101に対応する10進数
= -23+22+21+2-2+2-4 = -8+4+2+0.25+0.0625= -1.6875
方法2:1110 0101に対応する10進数
整数値の1を足
すのではない
0001 1010
ビット反転
最下位ビットに1を足す
+) 0000 0001
0001 1011 (= 20+2-1+2-3+2-4=1.6875)
もとの数は -1.6875
11