Swiftにおける符号付き整数型には、Int
、Int8
、Int16
、Int32
、Int64
があります。Int
の後に8や16と数字がついているのは、その整数のビット数を表します。例えばInt8は8ビットの符号付き整数なので、2^8個の値を表すことができます。具体的には-2^7~2^7-1、すなわち-128~127です。Int
は環境によってInt32
またはInt64
となります。
では、この最大値を超えた時の挙動はどうなるのでしょうか?
挙動を確認するため、SingleView Applicationを作って、ViewContoroller内で、Int8
の最大整数aに1を加えるコードを記述してみます。
let a:Int8 = Int8.max; // Int8の最大値
override func viewDidLoad() {
super.viewDidLoad()
var b:Int8 = a + 1;
}
これを実行すると、EXC_BAD_INSTRUCTIONというエラーが発生し、アプリが停止します。Int8
が最大値である127より大きな値や、-128より小さな値を取れないために発生するオーバーフローという現象です。
オーバーフローが起こってもエラーを発生させないためには、&を使います。
var b:Int8 = a &+ 1;
注意すべきは、b
の結果は128ではなく、-127になるという点です。つまり、Int8
の最小値である-128から1を足した値です。
#最後に
ゲームアプリにおける得点の管理にInt型を使っている時、Int
型が想定よりも大きな値になって、最大値を超えてエラーになるというのはよくある現象です。Int
の最大値、最小値を超えた時の挙動はきちんと抑えておきましょう。
ちなみに、ActionScript 3.0では、Int
(32ビット符号付き整数)の最大値を超えると、エラーは起きずに-2^16になります。