« 「天文屋のためのマイコン入門」条件ジャンプ命令 | トップページ | 「天文屋のためのマイコン入門」命令とデータのまとめ »

2014年6月 5日 (木)

「天文屋のためのマイコン入門」負の数の扱い

マイコンの基本のまとめの前に、負の数の扱いについて説明したいと思います。前回の例題で次のような命令を出しました。

ADDLW     -10       ワーキングレジスタから10を引く

-10という負の数が出てきました。今まで、レジスタは8ビットなので、扱える数の範囲は0~255までと説明しました。また、マイコンでは負の数の概念がないといってきました。それと矛盾するようなプログラムですが、上記は正しいです。

なぜ、正しいのか、なぜ負の数も扱えるのか。それはマイコンで扱う数が、数学でいうところのモジュラー演算(256で割ったあまり)だからです。

以前説明したように、PICマイコンが扱う数は255が最大です。これを超えると0に戻ると説明しました。そしてそこからまた0、1、2、と増えていきます。つまりある数Nがあるとすればnを整数として、

N =N + 256n

が成り立ちます。256の倍数を足したり引いたりしても良い。式で書くと難しいですが、数直線で書くとわかりやすいです。

1406051

したがって、-10という数は256を足した246とまったく同じです。

ADDLW  -10
  || 同等
ADDLW  246

これで負の数が除去できました。でもなぜ、246を足すことと、10を引くことが同等なのでしょうか?

255に1を足すと、0に戻ります。逆に言えば、0から1を引けば255になります。つまり-1と255が同等ということになります。
254に2を足すと、0に戻ります。つまり-2と254は同等ということになります。

実際、計算で確かめてみましょう。例として、100に246を足してみます。

100
+246
----
346

256を超えたので、256を引きます。

346
-256
----
90

100が90になったので10を引いたことと同等です。

この原理が直感的にわかるように数直線であらわしてみます。先ほどの循環する数直線を輪にしてみます。で、その中にダイアルがあって、現在は0を指してします。

1406052

今、このダイアルを246の位置に合わせたいとします。そうすると二通りの方法があります。

方法1 時計回りに246まわす
方法2 反時計回りに10まわす

もうお分かりになったと思いますが、時計回りに回すことが足し算を表し、反時計回りに回すことが引き算を表します。なんとなくわかっていただけたでしょうか。

ADDLW -10

というのは人間から見ると引き算をやっているように見えます。ただ、マイコンから見るとこれは単純な正数の足し算なのです。

ところで、246という数字は2進数で表すと、11110110です。

今、レジスタの各ビットが次のようになっているとします。

1406053

これを、246と見るか、-10と見るか、これは人間の都合です。どちらでもわかりやすい方で考えればいいのです。どちらにしてもマイコンは正しい結果を出します。(途中で見方を変えることさえOKです)

これを246と見る考え方を「符号なし」といいます。

これを-10と見る考え方を「符号付き」といいます。

繰り返しますが、マイコンのデータ自体に符号付き、符号なしの区別があるわけではありません。あくまでも人間の考え方です。
(高級言語は違います。たとえばC言語は変数自体に符号なし、付きの区別があります。int xと定義されれば符号付きです)

|

« 「天文屋のためのマイコン入門」条件ジャンプ命令 | トップページ | 「天文屋のためのマイコン入門」命令とデータのまとめ »

コメント

コメントを書く



(ウェブ上には掲載しません)




« 「天文屋のためのマイコン入門」条件ジャンプ命令 | トップページ | 「天文屋のためのマイコン入門」命令とデータのまとめ »