数字型の設定可能範囲
| Type | Min | Max |
|---|---|---|
| Int8 | -128 | 127 |
| Int16 | -32,768 | 32,767 |
| Int32 | -2,147,483,648 | 2,147,483,647 |
| Int64 | -9,223,372,036,854,775,808 | 9,223,372,036,854,775,807 |
| UInt8 | 0 | 255 |
| UInt16 | 0 | 65,535 |
| UInt32 | 0 | 4,294,967,295 |
| UInt64 | 0 | 18,446,744,073,709,551,615 |
Int32 は、32bitのintと明示的に指定している形。
浮動小数点型は、
float は、有効桁数7桁。
double は、有効桁数15桁。
ObjectiveCで使える便利な整数型
| Type | 32bit | 64bit |
|---|---|---|
| NSInteger | int | long |
| CGFloat | float | double |
整数型の場合はNSIntegerを、小数点型の場合はCGFloatを使うと、実行環境によって使用する型を判断してくれる。
32bit環境ではInt32、64bit環境ではInt64のサイズが演算するのに効率が良い (のですよね?)
なので、意識せずに効率のよいサイズを選んでくれるラッパー的な存在という認識。
int, float, doubleの実際のバイト数は後述。
処理系によって変わる対応バイト数
| Type | arm7 | arm64 |
|---|---|---|
| int | 32bit | 32bit |
| long | 32bit | 64bit |
| float | 32bit | 32bit |
| double | 64bit | 64bit |
arm7はiPhone5の32bitのアーキテクチャ。arm64はiPhone5sの64bitのアーキテクチャ。
ビルド時、どのアーキテクチャのバイナリを作るかの指定がある。
NSInteger では、int or long を切り替えてくれるのだが、arm7では実は intとlongは同じ32bit整数型だった。
しかし、arm64の場合、longは64bitになる。
結局以下の様になる感じ?
| Type | 32bit/arm7 | 64bit/arm7 | 64bit/arm64 |
|---|---|---|---|
| NSInteger | 32bit | 32bit | 64bit |
| CGFloat | 32bit | 64bit | 64bit |
Swiftの数字型
| Type | 32bit | 64bit |
|---|---|---|
| Int | Int32 | Int64 |
| UInt | UInt32 | UInt64 |
| Float | 32bit | 32bit |
| Double | 64bit | 64bit |
CGFloatの中途半端な型でなくて、FloatとDoubleを用途に合わせてえらんでねという方式なのだと思う。
CGRectのwidthなどCGFloatだったり、NSIntegerなもののやりとりは、castしないとコンパイルエラーになってくれるので、 精度が大丈夫かを考えながらcastしていけばよさそう。