16進電卓を作ってみよう8

   2012/05/08

コンピュータは、その昔「計算機」と訳されていたようです。
数字を扱うのが主目的だったからでしょう。

毎度、管理人イガジーです。

今ではコンピュータは、通信装置であり、記憶装置でもあり、
色々なモノの中に存在する身近なものになりました。

さて、計算するプログラムを作る際には、有効桁や誤差を
意識しなければならないことがあります。

昨日の最後に書いたように、今作成している16進電卓は
12345678901 と入力すると −539222987 になってしまいます。
これは、有効桁あふれ(オーバフロー)という現象です。

Java の int という「型」は、符号付き 32bit なので
扱える数値の範囲は、 -2147483648 〜 +2147483647 です。

普通は、これくらいの範囲の数が扱えれば十分なのですが
電卓プログラムなどでは、意地悪されると期待と異なる結果を出してしまいます。

昨日のプログラムを動かして、2147483647 + 1 を入力してみると
-2147483648 になる事が確かめられるでしょう。(エラーにはなりません)

では、どうしましょうか。

(a)扱える範囲を広げる(int → long にする)
(b)ある範囲を超えてしまったらエラーを表示する
(c)何もしない

long は、(Javaの場合) 符号付き 64bit で、扱える範囲は
-9223372036854775808 〜 +9223372036854775807 になります。

これだけ広い範囲が扱えりゃ、もう十分だろうと(a)+(c)で終り。
とするのもひとつの手です。というのも(b)は面倒だからです(^^;)

long にするには、次のように太字の部分をint → longにします。

long result=0,val1=0;
long calc(){
	long rv=result;
	if (stat==ADD) {
		rv=val1+result;
	}else if (stat==SUB) {
		rv=val1-result;
	}
	return rv;
}
void display(){
	String rs;
	if (radix==10)	rs=Long.toString(result);
	else rs=Long.toHexString(result).toUpperCase();
	dsp.setText(rs);
}

「型」のみの変更で済むので簡単です。

(b)のオーバーフロー対策は、
数字キー(nBtn)と、演算(calc())に範囲チェックを追加し
オーバーフロー状態であれば、表示(display())でエラーを表示し
[CLR]キー以外は受け付けなくする
という処理が必要になります。

具体的な例は、省略しますので、やってみてください。

また、足し算、引き算以外に、論理演算(NOT/AND/OR)や
掛け算、割り算を自力で追加してみるのも良い練習になるでしょう。
(割り算は、小数点処理が必要になるのでいささか面倒です)

16進電卓(もどき)を作りながらプログラミングに慣れる連載は
今日でひと区切りとします。※ もう1回追加して
オーバーフローチェックを入れたプログラム例も掲載しました。

内容はいかがでしたでしょうか?(難しかったでしょうか?)
ぜひ、率直なご意見、ご質問、ご感想などをお聞かせください。
こちらからどうぞ→メールフォーム

16進電卓を作ってみよう1
16進電卓を作ってみよう2
16進電卓を作ってみよう3
16進電卓を作ってみよう4
16進電卓を作ってみよう5
16進電卓を作ってみよう6
16進電卓を作ってみよう7
16進電卓を作ってみよう8(this)
16進電卓を作ってみよう9

この記事へのコメントはこちら

メールアドレスは公開されませんのでご安心ください。
また、* が付いている欄は必須項目となりますので、必ずご記入をお願いします。

内容に問題なければ、下記の「コメント送信」ボタンを押してください。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)