私はObjective-Cの開発者でC/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, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [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, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [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, dispatch_get_main_queue(), ^{
NSLog(@"seconds: %f", [start timeIntervalSinceNow]);
});
// output: seconds: -4.0001
なぜ適切に関連するdouble値にキャスト1と2の操作を行いますが、より大きな数字は(私は3テストおよび4)は0
として表現されるように見えますか?
私は、LLVM 3.0を使用するように設定されたXcode 4.2でコンパイルしています。
EDIT:
dispatch_time_tを次のように定義される。
typedef uint64_t dispatch_time_t;
そしてdispatch_timeである:1ため
#define NSEC_PER_SEC 1000000000 /* nanoseconds per second */
dispatch_timeのパラメータは何ですか? – Pubby
Thanks @Pubby、私は質問を更新しました。 –
1,2の作業と3,4はそれほど奇妙に思われます...私はそれを二重にチェックしますが、intが0fと評価されるインスタンスは確かにあります。 –