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)
// ^^^^^^
我在 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)
// ^^^^^^