※2013/09/30 NSIntgerの情報が抜けていたので追記。
この様なプログラムで確認。
NSLog(@"sizeof(char)=%zu", sizeof(char));
NSLog(@"sizeof(BOOL)=%zu", sizeof(BOOL));
NSLog(@"sizeof(bool)=%zu", sizeof(bool));
NSLog(@"sizeof(short)=%zu", sizeof(short));
NSLog(@"sizeof(int)=%zu", sizeof(int));
NSLog(@"sizeof(long)=%zu", sizeof(long));
NSLog(@"sizeof(long long)=%zu", sizeof(long long));
int a = 10;
NSLog(@"sizeof(&a)=%zu", sizeof(&a));
NSLog(@"sizeof(size_t)=%zu", sizeof(size_t));
NSLog(@"sizeof(NSInteger)=%zu", sizeof(NSInteger));
NSLog(@"sizeof(float)=%zu", sizeof(float));
NSLog(@"sizeof(double)=%zu", sizeof(double));
NSLog(@"sizeof(CGFloat)=%zu", sizeof(CGFloat));
【32bit環境】
※シミュレータの「iPhone Retina(4-inch)」で確認
| 型 | 返される値 |
|---|---|
| char | 1 |
| BOOL | 1 |
| bool | 1 |
| short | 2 |
| int | 4 |
| long | 4 |
| long long | 8 |
| ポインタ | 4 |
| size_t | 4 |
| NSInteger | 4 |
| float | 4 |
| double | 8 |
| CGFloat | 4 |
【64bit環境】
※シミュレータの「iPhone Retina(4-inch 64-bit)」で確認
| 型 | 返される値 |
|---|---|
| char | 1 |
| BOOL | 1 |
| bool | 1 |
| short | 2 |
| int | 4 |
| long | 8 |
| long long | 8 |
| ポインタ | 8 |
| size_t | 8 |
| NSInteger | 8 |
| float | 4 |
| double | 8 |
| CGFloat | 8 |
32bit環境と64bit環境とで異なる値が返されるものは以下の型。
| 型 | 32bit | 64bit |
|---|---|---|
| long | 4 | 8 |
| ポインタ | 4 | 8 |
| size_t | 4 | 8 |
| NSInteger | 4 | 8 |
| CGFloat | 4 | 8 |
float 型はどちらの環境でも4byteなのにも関わらず CGFloat は64bit環境では8byteなのは注意が必要ですね。後、意外なことに int は4byte(32bit)のままなんですね。CPUと同じbit数にする場合は int の代わりに NSInteger を使うと良さそうです。
ちなみに int のサイズがこの様になるのはAppleの64bit環境のデータモデルは LP64 だからです。 LP64 などデータモデルについてはこちらの記事が参考に成ります。
64ビットコンピューティング最前線:64ビットになると何が変わる?――64ビットプログラミングのデータモデル (2/2) - ITmedia エンタープライズ
http://www.itmedia.co.jp/enterprise/articles/0506/13/news006_2.html
関連情報
64-Bit Transition Guide for Cocoa Touch: Major 64-Bit Changes
https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Major64-BitChanges/Major64-BitChanges.html#//apple_ref/doc/uid/TP40013501-CH2-SW1