I was wondering whether I should use
NSInteger. It took me a bit but I figured it out!
On OS X and iOS the following table shows you the the size of the types:
char 8 bit short 16 bit int 32 bit long system size long long 64 bit
So, on 32bit OS X
long is 32 bit, on 64bit OS X it’s 64 bit (unsure for iOS).
NSInteger has always the size of an pointer.
Often asked: “Use int or NSInteger?”. Answer: use
NSInteger for pointers, ok usually you should use the pointer type itself, and for everything else use the size you require.
If you want exactly 8 bits, use
int8_t for sigend or
uint8_t for unsigned, for an integer which has at least those bits, use (
int_least8_t (analogue for 16/32/64 bits).
Performance: you can use (
int_fast8_t for the fastest type, which can hold (
int_8_t. But since (u)int_leastY_t and (u)int_fastY_t are defined as (u)intY_t on OS X and iOS it should make no difference. I use the direct types for when all the bits are used, and the fast types when I don’t use exactly but less bits.
At last: don’t forget the
ULL suffix for 64bit constants (you can use (
INT64_C(num) for always the correct suffix, also for 8/16/32), and the “%lld” in a formatted string for 64bit variables.
NSLog(@"number: %lld", 1LL << 48);)
If you have more information or maybe corrections, please post a comment.