iOS中CGFloat、NSInteger、NSUInteger
- CGFloat为double或float的typedef(别名)
- NSInteger为long或int的typedef(别名)
- NSUInteger为unsigned long或unsigned int的typedef(别名)
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个字节