5/11

コンピュータにおける
数値表現と演算(2)
2進数の演算
(算術演算,論理演算,シフト演算,符号拡張)
2進数の演算
算術演算
加算(+),減算(-),乗算(×),除算( ÷,/,mod )
商
論理演算
剰余(余り)
イクスクルーシブオア
論理積(AND),論理和(OR),排他的論理和(EXOR)
シフト演算
右シフト/左シフト,論理シフト/算術シフト
符号拡張
1
加算
1ビットの加算規則
0+0=0, 0+1=1, 1+0=1, 1+1=0(桁上げ)
桁上げを考慮した場合
例:1+0+1=(1+0)+1=1+1=0 (桁上げ)
下位からの桁上げ
8ビットの加算(符号なし整数)
桁上げ
+)
1
0
0
1
1
1
0
0
1
1
1
1
1
0
1
0
0
1
1
0
0
0
0
0
0
0 1 (=105)
1 0 (=58)
1 1 (=163)
減算(大-小の場合)
1ビットの減算規則
0-0=0, 1-0=1, 1-1=0, 0-1=1 (桁借り)
8ビットの減算(符号なし整数)
桁借り
1
1
1
0 1 1 0 1 0 1 1 (=107)
-) 0 0 1 1 0 1 0 0 (= 52)
0 0 1 1 0 1 1 1 (= 55)
2
減算(小-大の場合)
小さい数から大きい数を引いた場合
⇒ 負の数は2の補数で表現
例えば,52 - 107= -55
1 0011 0100 (= 52)
-) 0110 1011 (= 107)
1100 1001 (= -55) …2の補数表現
-27+26+23+20 = -128+64+8+1= -55
仮想的に 1 があると考える
【復習】 負の数の表現(2の補数)
8bitの場合
正の数
負の数
00110100
1100 1100
(=52)
(= -52)
最上位桁を符号ビットとみなし,
符号ビットを -27 (-128)の重みをもつ桁と考える。
( 1100 1100=-27+26+23+22 =-128 + 76=-52 )
注)16ビット, 32ビットの場合も最上位ビットを符号ビットと考える。
16ビットの場合は最上位ビットを-215,32ビットの場合は-231と考える。
3
減算
A - B = A + (-B)
-B は 「2の補数」を使って表現する
⇒ A と 「Bの2の補数」の加算によって
減算ができる
2の補数を用いた減算(大-小の場合)
減算は引く数を負数(2の補数)にして加算を行う
107 – 52 = 107 + (-52) = 55
例
0110 1011 (= 107)
+) 1100 1100 (= -52)
1 0011 0111 (= 55)
桁上げは
無視する
負数にする
(2の補数)
25+24+22+21+20 = 32+16+4+2+1=55
4
2の補数を用いた減算(小-大の場合)
減算は引く数を負数(2の補数)にして加算を行う
例
52 – 107 = 52 + (-107) = -55
0011 0100 (= 52)
+) 1001 0101 (= -107)
1100 1001 (= -55)
負数にする
(2の補数)
-27+26+23+20 = -128+64+8+1=-55
オーバーフロー(overflow)
: 演算結果として,表現できる数値の範囲を越えてしまい,
誤った演算結果をもたらす現象 (正+正=負または負+負=正)
例 : 2の補数表現 8ビットで表現できる数値の範囲 : -128 ~ 127
(一般に n ビット で表現できる数値の範囲 : -2n-1 ~ 2n-1-1)
オーバーフローを起こさない例
オーバーフローを起こす例
+ 68
+ 85
0 1000100
0 1010101
+68
-85
0 1000100
1 0101011
+153
1 0011001(-103)
-17
1 1101111(-17)
1 0111100
1 0101011
-68
+85
1 0111100
0 1010101
-68
-85
-153
1 0 1100111(+103)
桁上げが生じ,
オーバーフローが発生する
+17
1 0 0010001(+17)
桁上げは生じるが,
オーバーフローではない!
5
論理積(&, , AND )
1ビットの論理積
0&0=0, 0&1=0, 1&0=0, 1&1=1
16ビットの論理積
ビットごとに論理積演算を行う
1100 0111 1000 1001 (=a)
&) 0101 1000 1010 0111 (=b)
0100 0000 1000 0001 (=a&b)
論理和( l , +, OR )
1ビットの論理和
0 l 0=0, 0 l 1=1, 1 l 0=1, 1 l 1=1
16ビットの論理和
ビットごとに論理和演算を行う
1100 0111 1000 1001 (=a)
l ) 0101 1000 1010 0111 (=b)
1101 1111 1010 1111 (=a l b)
6
排他的論理和( ,
+
, XOR )
1ビットの排他的論理和
0 0=0, 0 1=1, 1 0=1, 1 1=0
16ビットの排他的論理和
ビットごとに排他的論理和演算を行う
1100 0111 1000 1001 (=a)
) 0101 1000 1010 0111 (=b)
1001 1111 0010 1110 (=a b)
シフト(shift;桁ずらし)演算
左シフト
論理シフト
シフト演算
右シフト
0と1のビット列を
ずらす
左シフト
算術シフト
最上位桁のビットは
変えずにずらす
7
※ 算術左シフトは算術右シフト
と同じ動作と考えてよい
右シフト
論理左シフト(<<)
例: b = a<<2 (16ビットデータ,2ビット左シフトの場合)
a
1100 0111 1000 1001
00
11 0001 1110 0010 0100
b
追い出されたビットは
捨てられる
最下位桁から
0が入ってくる
論理右シフト(>>)
例: b = a>>2 (16ビットデータ,2ビット右シフトの場合)
a
00 1100 0111 1000 1001
0011 0001 1110 0010 01
b
追い出されたビットは
捨てられる
最上位桁から
0が入ってくる
8
算術左シフト(<<): 論理左シフトと同じ動作
例: b = a<<2 (16ビットのデータ,2ビット左シフトの場合)
数値として考えた場合, n ビットの算術左シフトは 2n 倍することに相当する
正の数の場合の例
a
0 000 0000 1010 0000
00 a= 160
00 0000 0010 1000 0000
b
b= 640
追い出されたビットは
捨てられる
(b=22×a=4×a)
最下位桁から
0が入ってくる
算術左シフト(<<): 論理左シフトと同じ動作
例: b = a<<2 (16ビットのデータ,2ビット左シフトの場合)
数値として考えた場合, n ビットの算術左シフトは 2n 倍することに相当する
負の数の場合の例
a
1 111 1111 0110 0000
00 a= -160
11 1111 1101 1000 0000
b
b= -640
追い出されたビットは
捨てられる
最下位桁から
0が入ってくる
9
(b=22×a=4×a)
算術右シフト(>>)
例: b = a>>2 (16ビットのデータ,2ビット右シフトの場合)
数値として考えた場合, n ビットの算術右シフトは 1 n 倍することに相当する。
2
(2nで割ること)
正の数の場合の例
a
0000 0010 1000 0000
a= 640
0000 0000 1010 0000 00
b= 160
(b=
b
最上位桁のビットには元の数(a)の
最上位桁(符号ビット)と同じ値が入る
a
a
=
)
22 4
追い出されたビットは
捨てられる
算術右シフト(>>)
例: b = a>>2 (16ビットのデータ,2ビット右シフトの場合)
数値として考えた場合, n ビットの算術右シフトは 1 n 倍することに相当する。
2
(2nで割ること)
負の数の場合の例
a
1111 1101 1000 0000
a= -640
1111 1111 0110 0000 00
b= -160
(b=
b
最上位桁のビットには元の数(a)の
最上位桁(符号ビット)と同じ値が入る
10
a
a
=
)
2
4
2
追い出されたビットは
捨てられる
符号拡張
8bitの数値を16bitで表現するには...
符号bit を拡張する
00101101
(=45)
00000000 00101101
(=45)
11010011
(=-45)
11111111 11010011
(=-45)
32bit,64bitに拡張するのも同じ
なぜ「符号拡張」が必要か
加算(減算)は同じビット数にして演算を行う必要がある
例えば, 16 ビットで表現された 96 と 8 ビットで表現された -12 を足し算するとき,
正しい結果を得るためには,
+
8ビットの-12(1111 0100) を16ビットに
符号拡張して(1111 1111 1111 0100),
演算しなければならない
0000 0000 0110 0000 ( 96)
1111 0100 (-12)
0000 0001 0101 0100 (340)
0000 0000 0110 0000 ( 96)
+ 1111 1111 1111 0100 (-12)
この表現は正しい値(84)になっていない
(340 という結果になっている)
8
6
4
=2 +2 +2 +2
1 0000 0000 0101 0100 ( 84)
2
はみ出たこの1ビット
は無視してよい
11