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 << 63 产生的中间结果太大。
最佳答案
尝试println(UInt64(1) << UInt64(63))
.
类型推断器没有做好它的工作,并决定 1 << 63
是 UInt32
并使用了这个功能:func <<(lhs: UInt32, rhs: UInt32) -> UInt32
println(1 << UInt64(63))
之所以有效,是因为编译器知道从 UInt64(63)
开始是 UInt64
,然后整数文字 1
推断为 UInt64
,因此操作结果为 UInt64
并且没有超出范围。
关于swift - 为什么 "UInt64(1 << 63)"会崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30420614/