objective-c – 双重铸造问题

objective-c – 双重铸造问题,第1张

概述我是一个C/C++经验(零培训)的Objective-C开发人员,今天遇到了一些奇怪的编码数字值. 我确定这是一个简单/愚蠢的问题,但有人可以解释为什么这样做: NSDate *start = [NSDate date];dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, 1 * NSEC_PER_SEC);dispatch_ 我是一个C/C++经验(零培训)的Objective-C开发人员,今天遇到了一些奇怪的编码数字值.

我确定这是一个简单/愚蠢的问题,但有人可以解释为什么这样做:

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 – 双重铸造问题所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1028054.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-23
下一篇 2022-05-23

发表评论

登录后才能评论

评论列表(0条)

保存