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太大了。
答案 0 :(得分:2)
尝试println(UInt64(1) << UInt64(63))
。
类型推断器没有很好地完成其工作并决定 1 << 63
是UInt32
并使用此功能:func <<(lhs: UInt32, rhs: UInt32) -> UInt32
println(1 << UInt64(63))
有效,因为编译器知道由于UInt64(63)
是UInt64
,所以整数文字1
被推断为UInt64
,因此操作会导致UInt64
并且不会超出范围。