オーバーフローの実験


新人Y子
char型は、-128〜127まで表せるのですよね?
では、その範囲を超えた場合どうなるのですか?


しげちゃん先生
それでは、次のようなプログラムをつくって実験してみましょう。

新人Y子
このプログラムは何をしているのですか?
しげちゃん先生
char型の最大値127に、1を加えたらどうなるかを確認するプログラムです。
では、「Coding Ground」で確かめてみましょう。
新人Y子
はい、Coding Groundに、ソースコードを入力しました。


しげちゃん先生
では、「Execute」を押して、実行してみてください
新人Y子
実行しました。
あれ?エラーは出ないのですね。
そして、実行結果も「-128」となっていて、実際の答えとかなり違うのですが、なぜでしょう?


しげちゃん先生
はい、これが「オーバーフロー」した状態です。


新人Y子
オーバーフローすると、なぜプラスだったものがマイナスになるのでしょうか?

しげちゃん先生
では、確認してみましょう。
足す前の「127」は、2進数で「01111111」です。
これから、1を足してみてください。
新人Y子
「01111111」+1は、繰り上がりが続いて「10000000」ですね。
新人Y子
あっ!
最上位の符号ビットが変わってしまいました。

しげちゃん先生
そういう事ですね。
計算した結果の「10000000」は、char型の2の補数表現で、-128ですね。


新人Y子
だから、「-128」と表示されたのですね。
それにしても、オーバーフローすると、期待した値と大きく違う結果になってしまうのですね。

しげちゃん先生
そうなんです。オーバーフローは、バグの原因にもなります。


新人Y子
では、オーバーフローしないようにプログラムをつくるにはどうしたらいいですか?

しげちゃん先生
プログラムをつくる前に、値の範囲を見積もることです。
例えば、テストの点(100点満点)を記憶するには、char型使用で十分ですが、
マイナンバー(12桁)のような大きな値を扱う場合は、long型を使用するなどです。
新人Y子
そうやって、オーバーフローを回避するわけですね。
テクトレージマン
次回に続く
0