假设有两个变量:
let number1 : UInt8 = 100;
let number2 : UInt8 = 100;
您可以添加并打印它们
print(number1 + number2) //This prints 200
现在再定义一次
let number3 : UInt8 = 200;
并尝试立即添加
print(number1 + number3) // Throws execution was interrupted
据我所知,number1和number3的总和超出了UInt8的范围,但显式转换也无济于事,例如以下行也会出现同样的错误:
print(UInt8(number1 + number3)) // Throws execution was interrupted
我找到的方法是做以下事情:
print(Int(number1) + Int(number3))
当它们的总和超出范围时,是否有更好的方法来添加UInt8数字?
答案 0 :(得分:4)
Girish K Gupta,
UInt8的最大范围为0到255.您可以使用UInt8.min
和UInt8.max
进行检查。基本上是0到2的功率8。
print(number1 + number3)的问题将返回300. 300大于255因此崩溃。
当您添加两个UInt8时,默认情况下会将结果转换为UInt8,因此崩溃
最后当你Int(number1) + Int(number3)
强行将number1和number3强制转换为Int时。
使用Int时,其值的范围取决于运行它的平台32位或64位。例如,对于32位,其范围可以是-2,147,483,648到2,147,483,647。
当您将Int添加到Int时,结果将被强制转换为Int。并且相信我300在范围内:)
根据您的问题,有更好的方法:)
Apple的文档清楚地指定并指示使用Int而不是UInt8或UInt32甚至UInt64,除非使用UInt8,UInt32或UInt64绝对必要。
以下是苹果公司文档的引用:)
“仅当您特别需要无符号整数类型时才使用UInt 与平台的原生单词大小相同。如果不是这样的话 在这种情况下,Int是首选,即使要存储的值是 已知是非负面的。 Int对整数值的一致使用 帮助代码互操作,避免了在之间进行转换的需要 不同的数字类型,并匹配整数类型推断,“
摘自:Apple Inc.“Swift编程语言(Swift 2.2)。” iBooks的。 https://itun.es/in/jEUH0.l
对你来说最好的事情:)跟着苹果指令:)将number1,number2和number3改为Int :)问题解决了:))
因此没有崩溃:)
答案 1 :(得分:2)
正如您所说,将两个UInt8变量转换为Int会覆盖溢出时的默认异常,因为生成的Int现在有足够的空间来适应总和。
为了避免为每个操作转换变量,我们希望像这样重载运算符:
Providers
然而,这会给我们一个编译器错误,因为已经为添加两个UInt8定义了+运算符。
我们可以做的是define a custom operator,比如^ +意味着添加两个UInt8,但是像Int那样添加它们:
func + (left: UInt8, right: UInt8) -> Int {
return Int(left) + Int(right)
}
然后我们可以在我们的算法中使用它:
infix operator ^+ { associativity left precedence 140 }
func ^+ (left: UInt8, right: UInt8) -> Int {
return Int(left) + Int(right)
}
如果您希望结果只是溢出,可以使用the overflow operators from the standard library:
print(number1 ^+ number3) // Prints 300