2014年8月24日日曜日

iOSの数値型

iOSでの数値型について。何回かググり直しているので、まとめてみる。

数字型の設定可能範囲

TypeMinMax
Int8-128127
Int16-32,76832,767
Int32-2,147,483,6482,147,483,647
Int64-9,223,372,036,854,775,8089,223,372,036,854,775,807
UInt80255
UInt16065,535
UInt3204,294,967,295
UInt64018,446,744,073,709,551,615

Int32 は、32bitのintと明示的に指定している形。

浮動小数点型は、
float は、有効桁数7桁。
double は、有効桁数15桁。

ObjectiveCで使える便利な整数型

Type32bit64bit
NSIntegerintlong
CGFloatfloatdouble

整数型の場合はNSIntegerを、小数点型の場合はCGFloatを使うと、実行環境によって使用する型を判断してくれる。
32bit環境ではInt32、64bit環境ではInt64のサイズが演算するのに効率が良い (のですよね?)
なので、意識せずに効率のよいサイズを選んでくれるラッパー的な存在という認識。
int, float, doubleの実際のバイト数は後述。

処理系によって変わる対応バイト数

Typearm7arm64
int32bit32bit
long32bit64bit
float32bit32bit
double64bit64bit

arm7はiPhone5の32bitのアーキテクチャ。arm64はiPhone5sの64bitのアーキテクチャ。
ビルド時、どのアーキテクチャのバイナリを作るかの指定がある。

NSInteger では、int or long を切り替えてくれるのだが、arm7では実は intとlongは同じ32bit整数型だった。
しかし、arm64の場合、longは64bitになる。
結局以下の様になる感じ?
Type32bit/arm764bit/arm764bit/arm64
NSInteger32bit32bit64bit
CGFloat32bit64bit64bit

Swiftの数字型

Type32bit64bit
IntInt32Int64
UIntUInt32UInt64
Float32bit32bit
Double64bit64bit
小数点がある数値の型推論は、デフォルトDoubleになるらしい。
CGFloatの中途半端な型でなくて、FloatとDoubleを用途に合わせてえらんでねという方式なのだと思う。
CGRectのwidthなどCGFloatだったり、NSIntegerなもののやりとりは、castしないとコンパイルエラーになってくれるので、 精度が大丈夫かを考えながらcastしていけばよさそう。

• • •