0、先测试确定范围:不同机型系统测试发现只有32位机器有问题,很有可能被截断了
1、看NSInteger的定义
在32位机器上是int类型的,占4个字节,最大可表达(2的31次方-1)(不是32次方,有一位是符号位)大概是21亿多
-2147483648 到 2147483647
ps:自行复习《原码、补码、反码》
2、为什么被截断?
比如接口返回了个时间戳:从1970年到当前时间的毫秒数
{
"startTime": 1560942803000
}
数一数位数,显然远大于21亿,如果这时候用NSInteger接收就回被截断
3、怎么截断?!
打开系统自带的计算器,显示成编程器
粘贴上面的数值,显示如下:
红框里是高4个字节,绿色框的是低4字节,可以一个一个的把红框里的1点成0,
就得到截断后的结果了(ps:仅在被截断后是正数时,因为负数是反码的补码)
解析时取NSNumber的integerValue的时候会只取低4字节,
注意:如果是数值是被双引号包围的,解析的时候用的是字符串。
{
"startTime": "1560942803000"
}
NSString的integerValue是做过一些处理的。只要超过了表达范围就返回最大值(32位是2147483647)
所以每次解析结果都是2147483647