본문 바로가기
프로그래밍 놀이터/iOS

[ios] NSInteger, NSUInteger on 32bit / 64bit

by 돼지왕 왕돼지 2018. 2. 17.
반응형

[ios] NSInteger, NSUInteger on 32bit / 64bit


%@, %d, %ld, %lu, %tu, %u, %zd, 32bit, 64bit, converting, define, formmatting char, iNT, IOS, literal, long, NSInteger, NSNumber converting, nsuinteger, NSUInteger on 32bit / 64bit, unsigned int, unsigned long, [ios] NSInteger, __lp64__


-

32bit 에서..


NSInteger, NSUInteger 는 각각 int, unsigned int 에 mapping 된다.

그래서 로그를 찍을 때 formmatting char 에는 %d 와 %u 에 각각 매핑된다.



-

64bit 에서는...


NSInteger, NSUInteger 는 각각 long 과 unsinged long 에 mapping 된다.

그래서 로그를 찍을 때 formmatting char 에는 %ld 와 %lu 에 각각 매핑된다.



-

bit 에 상관없이 formmatting char 를 가장 안전하게 사용하는 방법은

NSInteger, NSUInteger 를 NSNumber 로 converting 해서 %@ 형태로 프린팅하는 것이다.


converting 은 @(number) 와 같은 방법으로 손쉽게 할 수 있다.

( 이 방법은 tagged pointer 라는 것때문에 새로운 object 를 만드는 것도 아니라고 한다, tagged pointer 는 알아서 찾아보셈. )



-

그래도 converting 하는 방법이 별로라면..

NSInteger 는 long 으로 NSUInteger 는 unsigned long 으로 converting 해서 printing  하는 것이 안전하다.



-

NSInteger 에는 %zd 를, NSUInteger 에는 %tu 를 사용하는 것이 좋다는 이야기도 있다.

그러나 이는 세부 내용을 보면 z 와 t 의 내부구현이 변경소지가 있기 때문에 이 역시 위험할 수 있다고….



-

아래와 같이 define 하여 사용하는 것이 가장 안전하다는 이야기도 있다.

#if __LP64__

#define NSI "ld"

#define NSU "lu"

#else

#define NSI "d"

#define NSU "u"

#endif


ex)

[NSString stringWithFormat:@"%"NSU" things in the array.", array.count]



-

개인적으로 여러 가지 방법을 보았을 때 가장 합리적이며 안정적인 방법은 NSNumber 로 wrapping 해서 %@ 를 사용하는 방법이다.




반응형

댓글