Swift中奇怪的UInt64行为

时间:2014-11-30 18:22:37

标签: ios swift

所以我一直在玩BigInteger实现,我发现了一些奇怪的东西......

这段代码:

let largeInt: UInt64 = UInt64(pow(Double(2), Double(64)))

我预计它会崩溃..但是相反,largeInt等于0.之后,如果我尝试使用largeInt,我会得到意想不到的结果。

例如,这个:

let int1: UInt64 = largeInt - 1

再次,我预计它会崩溃(0 - 1显然不是有效的unsigned int)。但是,在调试器中它不会崩溃,我看到一个值为3472(??)。关于发生了什么的任何想法?

编辑: 实际上它看起来像第二行确实导致崩溃,但直到函数结束(我设置int1后我在行上有一个断点)。 largeInt仍然不会导致崩溃。

1 个答案:

答案 0 :(得分:2)

对我来说这看起来像个错误。

let p1 = pow(Double(2), Double(64))

大于UInt64.max,因此

let x1 = UInt64(p1)

应该崩溃(或者作为近似值返回UInt64.max)。

“下一个较小的”浮点双变量

let p2 = nextafter(p1, 0.0)
let x2 = UInt64(p2)
// 18446744073709549568

正确转换,“下一个更大”的浮点双变量 无法正确转换

let p3 = nextafter(p1, DBL_MAX)
let x3 = UInt64(p3)
// fatal error: floating point value can not be converted to UInt64
// because it is greater than UInt64.max