【发布时间】:2016-05-16 07:28:35
【问题描述】:
在操场上测试我的代码时我很困惑
var test: [UInt8] = [5, 6, 7, 8]
print(test[0]) -> 5
print(5<<8) -> 1280
print(test[0]<<8) -> error
原来是上面的错误
谁能解释一下?
【问题讨论】:
标签: arrays swift bitwise-operators
在操场上测试我的代码时我很困惑
var test: [UInt8] = [5, 6, 7, 8]
print(test[0]) -> 5
print(5<<8) -> 1280
print(test[0]<<8) -> error
原来是上面的错误
谁能解释一下?
【问题讨论】:
标签: arrays swift bitwise-operators
使用按位移位运算符时,您必须将要移位的值的类型大小小于移位,以位为单位。在这种情况下,您尝试将 UInt8 移动 8 位 - 这超出了该范围。
它适用于print(5<<8) -> 1280 的原因是因为 Swift 将这些类型推断为Int - 因此它将是 32 位或 64 位,具体取决于平台。因为 8 小于这个,所以它会起作用。
如果您将5 显式转换为UInt8,您将收到编译器 错误提示:
移位量大于或等于类型大小(以位为单位)
但是,Swift 似乎无法为数组提供相同的编译器错误——只有运行时错误。
因此,解决方案是使用更大的类型。根据您使用此代码的目的,您可能需要使用 UInt16 数组。
var test: [UInt16] = [5, 6, 7, 8]
或者,如果您使用独立于数组的移位值,您可以在移位之前将它们转换为更大的类型:
print(UInt16(test[0])<<8)
尽管您应该注意 Apple recommends you use Int 用于整数类型,即使您的值已知为非负数 - 除非您特别需要使用固定大小的类型。
【讨论】:
您不能将 UInt8 移动 8 位或更多位。如果你检查控制台,你会发现 Swift 运行时告诉你。
fatal error: shift amount is larger than type size in bits
5 << 8 起作用的原因是因为5 是一个Int,其大小通常为 32 或 64 位。
如果您想要更大的整数输出,请在进行移位之前转换值:
print(UInt32(test[0]) << 8)
// ^^^^^^
【讨论】: