8Bit で表現出来る整数の範囲
昨日の続きですが、Z80 は 8Bit CPU なので基本的な計算は 8Bit で行います。8Bit のレジスタを二つセットにして 16Bit の計算も行えますが、基本は 8Bit です。
さて、この 8Bit で表現出来る範囲は以下の2通りです。
- 符号無し 8Bit 0 〜 255
- 符号付き 8Bit -128 〜 +127
内部的な表現は 0x00 〜 0xFF で全く一緒ですが、人間が符号付きと符合無しを区別することでマイナスも表現出来るようになる訳です。
今回のエミュレータでは、8Bit の数値を byte 型で表現しています。byte 型は 0 〜 255 の符合無し整数です。試しに以下のコードを実行してみます。
byte b = 0; b--;
実行すると b は 255。0 以下は表現できませんので、オーバーフローが発生して最大値である 255 になってしまうんですね。
int i = -1; byte b = (byte)i;
これも同じです。int の -1 は 0xFFFFFFFF ですが、キャストによって余分なビットは全て切り捨てられて、正しく変換されます。
Z80 エミュレータを作る上では byte 型で数値を扱うことで特に意識することなく Z80 チックな処理を記述できますが、オーバーフローを確実にチェックする(キャリーフラグに反映させる)必要があります。
余談ですが byte 型だとあっと言う間にオーバーフローが発生してしまいますが、int 型でも気を抜くとオーバーフローしてしまったりしますね。この手のバグはなかなか原因を発見出来なかったりしますので、プログラムを作る上で気を付けておかないと痛い目に会うことがあります。C# はオーバーフローを検出する機能(例外を生成出来る)もありますので、これを使ってチェックすることは可能です。今回のプログラムでは byte 型や ushort 型のオーバーフローは仕様ですので unchecked 構文の(数少ない^^;)出番となります。やっぱ C# は良いですね〜。