オーバーフローなんかの話
※画像はイメージです
新年度ですし、軽いネタでも
オーバーフローって聞くとわくわくする一部の方もいると思います。 とくにスタックオーバーフローはゲームのやりこみ勢にとっては格好のおもちゃでしょう。 Final Fantasy 6の52回全滅バグなんて有名ですね
ですが今回はスタックではなく桁あふれの方です
static void Main(string[] args) { _itemCount = 255; AddItem(); Console.WriteLine($"Item:{_itemCount}"); // Item:0 } static byte _itemCount; static void AddItem() { _itemCount++; }
上のコードはC#ですが、まぁ言語はなんでもいいですね。_itemCount
が255 (byteの最大値) の時に _itemCount
をインクリメントすると桁あふれを起こして0になっちゃうという、上限値チェックしろよという突っ込み多数なんだけどゲームでいまだにたまに見かけるやつです
桁あふれってどういうことかは、まぁググってください
1111 1111
+ 0000 0001
= 1 0000 0000
みたいな感じでしょーか
逆のパターン
先ほどは増やした結果減ってしまいましたが、逆も当然あります
static void Main(string[] args) { _itemCount = 0; SubItem(); Console.WriteLine($"Item:{_itemCount}"); // Item:255 } static byte _itemCount; static void SubItem() { _itemCount--; }
こんな感じで減らす処理を呼んでアイテム数を255に増やしてみました
さて、この現象をなんと呼んでいますか?
これをオーバフローの逆(?)だからアンダーフローと呼んでいるとアンダーフロー警察に指摘されます。これは負のオーバーフローと呼ばれる現象です。上限値超えて下限値になるのもその逆もどっちもオーバーフロー(桁あふれ)です
アンダーフロー
ではアンダーフローはどういうことなのかというと
var f = 1e-45f; Console.WriteLine($"{f == 0}"); // False f = 1e-46f; Console.WriteLine($"{f == 0}"); // True
こういうやつのことです。この例ではf
はfloat
(4byteの浮動小数点)で、1×10^-46 (10のマイナス46乗)くらいまで行くと0と同じ値になってしまいます。詳しく知りたい人はググってください
まとめ
こういう単語かっこいい(?)ので使いたくなりますが、正しく使わないと「はぁ?(。´・ω・)?」みたいな感じになるので注意した方がいいです
んで、何が言いたかったかというと新年度ということは4月ということで1年の四分の一が終わってしまったということです。まぁ月は上限値が12なのであと9回インクリメントすると1に戻るから安心ですけど