Mar 222014
 

Objective-Cでは、整数表現にintやuintやNSUInteger等様々ある。NSString文字変換したり、計算したり、カウントしたりNSArray配列に格納したり様々使い分ける。Objective-Cでのプログラミングには様々な整数表現の違いが出てくる。

Integerとは?
英語の整数の意味。プログラミングでは整数型。 整数とは何か?wikipediaによると、

0 とそれに 1 ずつ加えていって得られる自然数 (1, 2, 3, …) および 1 ずつ引いていって得られる数 (−1, −2, −3, …) の総称である。

http://ja.wikipedia.org/wiki/整数

UIntegerとは符号無し(Unsigned)の整数(Integer)。つまり、Objective-CでのNSUIntegerは正の整数を扱う数である。

符号とは、コンピュータ内部での数値の正負(ゼロより大きいか小さいか)の表現方法…

http://ja.wikipedia.org/wiki/符号付数値表現

NSIntegerかintか?NSUIntegerかuintか?

深い事を抜きにすれば、intはNSIntegerとイコール、uintはNSUIntegerとイコールと使える。
特別な要求が無い限りはNSUInteger/NSIntegerを使うのがベター。具体的な違いは以下のリンク。

http://stackoverflow.com/questions/4445173/when-to-use-nsinteger-vs-int

NSNumberとは?
数を表すオブジェクト型。NSArrayやNSMutableArrayやCoreDataにはプリミティブ型(NSUInteger)を格納できない。 この場合、オブジェクト型(NSNumber)に変換をする。NSArrayでは、格納できるデータはオブジェクト型になる一方、添字となる番号の型はプリミティブ型(NSUInteger)。

定義まとめ
プリミティブ型では*記号無し…

NSInteger num=1;
int num=1;
uint num=1;

オブジェクト型では*記号あり…

NSNumber *num=1;

変換まとめ
プリミティブ型(NSUInteger)→オブジェクト型(NSNumber)

[NSNumber numberWithUnsignedInt:1];

オブジェクト型(NSNumber)→プリミティブ型(NSUInteger)

[NSNumber unsignedIntegerValue]

プリミティブ型(NSUInteger)→オブジェクト型(NSString)

NSString *str = [NSString stringWithFormat:@"%d", 1];

64bit環境への移行

(2014/03追記)
以下、64bit環境に移行する場合のコード記述の注意点。

  • 64ビット long 整数を32ビット整数に代入しない
  • 64ビットポインタを32ビット整数に代入しない
  • 算術演算の際に起こるポインタや long 整数の切り捨て(truncation)(その他、整数型の違いによる算術演算上の問題)を避ける
  •   データ型のバイト長の違いによって起こる、揃え境界(alignment)の問題を解消する。
  • 32ビットランタイム、64ビットランタイムで共通に用いる構造体は、メモリ上の配置が同じであるようにする。
  • アセンブリ言語で記述したコードは、64ビット版の新しい命令コード(opcodes)やランタイムに合わせて書き直す
  •   可変引数の関数を固定引数の関数に(あるいはその逆に)キャストすることは避ける

(下記から一部引用)

https://developer.apple.com/library/ios/documentation/General/Conceptual/CocoaTouch64BitGuide/Introduction/Introduction.html#//apple_ref/doc/uid/TP40013501

https://developer.apple.com/jp/devcenter/ios/library/documentation/CocoaTouch64BitGuide.pdf

コメント

個のコメント

Powered by Facebook Comments

 Posted by at 12:16

Sorry, the comment form is closed at this time.