为什么" UInt64(1<< 63)"崩溃?

时间:2015-05-24 06:09:21

标签: swift

println(UInt8(1 << 7)) // OK
println(UInt16(1 << 15)) // OK
println(UInt32(1 << 31)) // OK
println(UInt64(1 << 63)) // Crash

我想了解为什么只有UInt64会发生这种情况。谢谢!

编辑: 为了使问题更加混乱,以下所有工作:

println(1 << UInt8(7))
println(1 << UInt16(15))
println(1 << UInt32(31))
println(1 << UInt64(63))

我的猜测是计算1&lt;&lt;&lt;&lt; 63太大了。

1 个答案:

答案 0 :(得分:2)

尝试println(UInt64(1) << UInt64(63))

类型推断器没有很好地完成其工作并决定 1 << 63UInt32 并使用此功能:func <<(lhs: UInt32, rhs: UInt32) -> UInt32

println(1 << UInt64(63))有效,因为编译器知道由于UInt64(63)UInt64,所以整数文字1被推断为UInt64 ,因此操作会导致UInt64并且不会超出范围。