iOS中32位和64位处理器 NSInteger的数值范围

背景

最近遇到了一个需求,我们有一批小程序的用户,在小程序产生的内容想要在app中展示,这批用户的id是从50亿开始的(很难想象,我们公司的用户什么时候能突破50亿。。。),而我们app现在的userId是使用NSInteger,我们要确保userId的使用没有问题。

我搜索了下相关资料,iOS的设备,从iphone5s起,全部使用64位的处理器,之前的都是32位处理器。而NSInteger在32位和64位机器上面表现范围如何呢?且往下看

32位和64位NSInteger定义

1
2
3
4
5
6
7
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

32位系统

int占4个字节(byte) 32位(bit)

2^32 = 4294967296, NSInteger有正负,则范围为: -2147483648 ~ 2147483647

NSInteger 是 int 别称,占4个字节,32位,范围: -2147483648 ~ 2147483647

NSUInteger 不带符号,占4个字节,32位 范围: 0 ~ 4294967295

long 占4个字节 32位 范围: -2147483648 ~ 2147483647

long long 占8个字节 64位 范围: -9223372036854775808 ~ 9223372036854775807

64位系统

int占4个字节(byte) 32位(bit) 范围: -2147483648 ~ 2147483647

long 占8个字节 64位 范围: -9223372036854775808 ~ 9223372036854775807

NSInteger 是 long 的别称,占8个字节 64位 范围等同long: -9223372036854775808 ~ 9223372036854775807

NSUInteger 不带符号,占 8个字节, 64 位, 范围: 0 ~2^64-1

long long 占8个字节,64位: -9223372036854775808 ~ 9223372036854775807

id之类的,该用什么类型呢?

目前看,前端大部分都是使用int或者string,这两个类型其实都可以,但考虑到后期发展可能遇到的类似我遇到的范围问题,我觉得统一成string会好一些。

后台的话,考虑的就不只是前端的兼容和适配问题,还有诸如性能,容量,速度等,我看很多人推荐使用UUID,以下两篇文章是我阅读中看到的,感兴趣的话可以都查下相关资料。

1 Integer还是String?
*. 通用唯一识别码