我在操场上测试我的代码时感到困惑
var test: [UInt8] = [5, 6, 7, 8]
print(test[0]) -> 5
print(5<<8) -> 1280
print(test[0]<<8) -> error
错误结果如上所述
任何人都可以解释一下吗?
答案 0 :(得分:3)
使用按位移位运算符时,必须按位移动小于要移位的值的类型大小。在这种情况下,您尝试将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
,即使您的值已知为非负数 - 除非您特别需要使用固定大小的类型。
答案 1 :(得分:3)
您无法将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)
// ^^^^^^