我确定这是一个简单/愚蠢的问题,但有人可以解释为什么这样做:
NSDate *start = [NSDate date];dispatch_time_t popTime = dispatch_time(disPATCH_TIME_Now,1 * NSEC_PER_SEC);dispatch_after(popTime,dispatch_get_main_queue(),^{ NSLog(@"seconds: %f",[start timeIntervalSinceNow]);});// output: seconds: -1.0001
而且这也是有效的(注意秒数已经改变):
NSDate *start = [NSDate date];dispatch_time_t popTime = dispatch_time(disPATCH_TIME_Now,2 * NSEC_PER_SEC);dispatch_after(popTime,[start timeIntervalSinceNow]);});// output: seconds: -2.0001
但这是立即执行的:
NSDate *start = [NSDate date];dispatch_time_t popTime = dispatch_time(disPATCH_TIME_Now,4 * NSEC_PER_SEC);dispatch_after(popTime,[start timeIntervalSinceNow]);});// output: seconds: -0.0001
但是,使用4.0而不是4修复它:
NSDate *start = [NSDate date];dispatch_time_t popTime = dispatch_time(disPATCH_TIME_Now,4.0 * NSEC_PER_SEC);dispatch_after(popTime,[start timeIntervalSinceNow]);});// output: seconds: -4.0001
为什么1和2适当地转换为相关的双重值,但是较大的数字(我测试3和4)似乎表示为0?
我正在使用Xcode 4.2编译,配置为使用LLVM 3.0.
编辑:
dispatch_time_t定义为:
typedef uint64_t dispatch_time_t;
而dispatch_time是:
dispatch_time_t dispatch_time(dispatch_time_t when,int64_t delta);
而NSEC_PER_SEC是:
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */解决方法 一秒钟内有1,000,000纳秒,所以我要假设NSEC_PER_SEC被定义为1000000000.
> 4是int类型
> 4.0是double类型
现在假设一个int包含32位,int的范围是[-2,147,483,648到2,647]
4000000000> 2147483647,因此你会导致int溢出,这将导致该值被设置为0.
编辑:我可能会更好地写上述声明.溢出可能导致int(假设它的大小为32位,如上所述)等于值-294967296,dispatch_time将任何值<= 0处理为0秒.这就是上面的“0”来的地方. 双变量可以保存比int大的值,并且能够存储值为4000000000的近似值.
总结以上是内存溢出为你收集整理的objective-c – 双重铸造问题全部内容,希望文章能够帮你解决objective-c – 双重铸造问题所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)