符号拡張

符号拡張を定数加算に置き換えることが出来る。理解が中途半端なのでまとめてみた。

4ビット整数を8ビット整数に符号拡張するには符号ビット(MSB)を上位に伝播させればいい。

0110 => 00000110 (6)
1010 => 11111010 (-6)

符号ビットが1かどうかによって分岐する代わりに

  1. MSBを反転
  2. 11111000を足す

ことによって同じ操作ができる。

0110 => 1110 => 1110 + 11111000 => 00000110 (6)
1010 => 0010 => 0010 + 11111000 => 11111010 (-6)

ところで

  1. MSBを反転することは、定数8を足すことと等しい
  2. 11111000は8ビット整数において-8である

のでこれらを足すと打ち消される。つまり符号拡張をする代わりに定数の加算でつじつまをあわせることができる。

よって例えば、

4ビット整数の6と5ビット整数の-12を足す場合
    0110
+) 10100
--------

1.まずMSBを反転し、6ビットにするため0を追加して加算(答えの変域は6ビット整数)
   001110
+) 000100
---------
   010010

2. MSBの反転操作を打ち消すために、-8と-16すなわち-24を足す
   010010
+) 101000 (-24)
---------
   111010 (-6 = 6 + (-12)) 

定数加算の部分は回路に組み込める(レジスタを消費しない)し、MSBの反転はNOTゲートをいれるだけなので非常に効率良く演算ができる。