5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SwiftでIntの最大値・最小値を超えた時の挙動(オーバーフロー)

Last updated at Posted at 2015-07-11

Swiftにおける符号付き整数型には、IntInt8Int16Int32Int64があります。Intの後に8や16と数字がついているのは、その整数のビット数を表します。例えばInt8は8ビットの符号付き整数なので、2^8個の値を表すことができます。具体的には-2^7~2^7-1、すなわち-128~127です。Intは環境によってInt32またはInt64となります。

では、この最大値を超えた時の挙動はどうなるのでしょうか?

挙動を確認するため、SingleView Applicationを作って、ViewContoroller内で、Int8の最大整数aに1を加えるコードを記述してみます。

Swift
let a:Int8 = Int8.max;  // Int8の最大値
override func viewDidLoad() {
    super.viewDidLoad()
    var b:Int8 = a + 1;
}

これを実行すると、EXC_BAD_INSTRUCTIONというエラーが発生し、アプリが停止します。Int8が最大値である127より大きな値や、-128より小さな値を取れないために発生するオーバーフローという現象です。

スクリーンショット 2015-07-11 20.16.45.png

オーバーフローが起こってもエラーを発生させないためには、&を使います。

Swift
var b:Int8 = a &+ 1;

注意すべきは、bの結果は128ではなく、-127になるという点です。つまり、Int8の最小値である-128から1を足した値です。

#最後に
ゲームアプリにおける得点の管理にInt型を使っている時、Int型が想定よりも大きな値になって、最大値を超えてエラーになるというのはよくある現象です。Intの最大値、最小値を超えた時の挙動はきちんと抑えておきましょう。
ちなみに、ActionScript 3.0では、Int(32ビット符号付き整数)の最大値を超えると、エラーは起きずに-2^16になります。

5
8
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
8

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?