コンピュータにおける 数値表現と演算(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
© Copyright 2024 ExpyDoc