iOS中CGFloat、NSInteger、NSUInteger

2019-06-28  本文已影响0人  coming_168

1. CGFLOAT

typedef float CGFloat;   // 32-bit
typedef double CGFloat;  // 64-bit

1⃣️在32位系统下, CGFLOAT是float类型
float: 4个字节
double: 8个字节
2⃣️在64位系统下, CGFLOAT是double类型
float: 4个字节
double: 8个字节

2. NSInteger

typedef int NSInteger;   // 32-bit
typedef long NSInteger;  // 64-bit

NSInteger是一个封装,它会识别当前操作系统的位数,自动返回最大的类型
1⃣️在32位系统下,NSInteger为int:
int 占4个字节
long 占4个字节
NSInteger 是int的别名,占4个字节
long long 占8个字节
int32_t 是int的别名,占4个字节
int64_t 是long long的别名,占8个字节
2⃣️在64位系统下,NSInteger为long:
int 占4个字节
long 占8个字节
NSInteger 是long的别名,占8个字节
long long 占8个字节
int32_t 是int的别名,占4个字节
int64_t 是long long的别名,占8个字节

注:

32位程序:NSInteger相当于int32_t,4个字节为int的别名。
64位程序:NSInteger相当于int64_t,8个字节为long long的别名。

int的范围是:-2147483648~2147483647(-2^32 ~ 2^32-1)。可以表示到10位数,再大就不行了。

long long的范围是:-9223372036854775808~9223372036854775807(-2^64 ~ 2^64-1)。可以表示到19位,位数已经很大,一般都够用了。

在类型转换的时候
例如:int64_t转换成NSInteger,在64位系统中是正常的
但在32位系统中就可能会导致溢出
对于一个11位的整数,它在64位系统中使用NSInteger或者long类型(占8字节),是可以正常存储的;如果是在32位系统中,它就溢出了(占4字节)

3. NSUInteger

typedef unsigned int NSUInteger;  // 32-bit
typedef unsigned long NSUInteger; // 64-bit

unsigned 是无符号的意思 : NSUInteger是无符号的,即没有负数;NSInteger是有符号的。所以NSUInteger类型不能给它赋负值。
1⃣️在32位系统下
unsigned int : 4个字节
unsigned long: 4个字节
2⃣️在64位系统下
unsigned int : 4个字节
unsigned long: 8个字节

4. char

1⃣️在32位系统下
char :1个字节
2⃣️在64位系统下
char :1个字节

上一篇下一篇

猜你喜欢

热点阅读