Swift Array[UInt8] 使用按位运算符不起作用?

Swift Array[UInt8] using Bitwise operator not work?

我在 playground 上测试我的代码时感到困惑

var test: [UInt8] = [5, 6, 7, 8]

print(test[0]) -> 5

print(5<<8) -> 1280

print(test[0]<<8) -> error

错误结果如上

谁能解释一下?

使用按位移位运算符时,您必须移位小于 要移位的值的类型大小(以位为单位)。在这种情况下,您试图将 UInt8 移动 8 位——这超出了该范围。

它为 print(5<<8) -> 1280 工作的原因是因为 Swift 推断这些类型属于 Int – 因此它将是 32 位或 64 位,具体取决于平台。因为8小于这个,就可以了。

如果您明确地将 5 转换为 UInt8,您将得到一个 编译器 错误提示:

Shift amount is greater than or equal to type size in bits

但是,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)
//    ^^^^^^