随机位双问题

时间:2011-06-29 13:55:57

标签: casting double endianness nstimeinterval

我在GTMHTTPFetcher.mgtm-http-request中看到以下行:

// set min interval to a random value between 1.0 and 2.0 seconds
minRetryInterval_ = 1.0 + ((double)(arc4random() & 0x0FFFF) / (double) 0x0FFFF);
  1. 为什么除法运算符的两个操作数都被强制转换为double

  2. & 0x0FFFF做了什么?

  3. 这是否独立于系统的endianness

  4. 我们如何确保0x0FFFF总是大于arc4random() & 0x0FFFF?如果系统使用两个赞美怎么办?

1 个答案:

答案 0 :(得分:0)

  1. 除了double minRetryInterval_NSTimeInterval之后,除法运算符的两个操作数都被强制转换为typedef double。也许,将它们转换为NSTimeInterval代替它们可能更有意义。

  2. & 0x0FFFF生成u_int32_t生成的随机unsigned int的最右边16位,即arc4random()的所有内容。

  3. 是的,这应该独立于系统的字节顺序,因为分母0x0FFFF是最大可能的16位double,因此,商总是小于或等于到1。

  4. double的最高位是sign bit。在这种情况下,两个符号位都是0,所以我们可以确定商是正的。此外,根据double的规范,0x0FFFF的幅度大于0x0FFFE,例如。