Swift溢出運算符
溢出運算符
默認情況下,當你往一個整型常量或變量賦於一個它不能承載的大數時,Swift不會讓你這麼乾的,它會報錯。這樣,在操作過大或過小的數的時候就很安全了。
例如,Int16
整型能承載的整數範圍是-32768
到32767
,如果給它賦上超過這個範圍的數,就會報錯:
var potentialOverflow = Int16.max
// potentialOverflow 等於 32767, 這是 Int16 能承載的最大整數
potentialOverflow += 1
// 噢, 出錯了
對過大或過小的數值進行錯誤處理讓你的數值邊界條件更靈活。
當然,你有意在溢出時對有效位進行截斷,你可采用溢出運算,而非錯誤處理。Swfit為整型計算提供了5個&
符號開頭的溢出運算符。
-
溢出加法
&+
-
溢出減法
&-
-
溢出乘法
&*
-
溢出除法
&/
-
溢出求餘
&%
值的上溢出
下麵例子使用了溢出加法&+
來解剖的無符整數的上溢出
var willOverflow = UInt8.max
// willOverflow 等於UInt8的最大整數 255
willOverflow = willOverflow &+ 1
// 這時候 willOverflow 等於 0
willOverflow
用Int8
所能承載的最大值255
(二進製11111111
),然後用&+
加1。然後UInt8
就無法表達這個新值的二進製了,也就導致了這個新值上溢出了,大家可以看下圖。溢出後,新值在UInt8
的承載範圍內的那部分是00000000
,也就是0
。
值的下溢出
數值也有可能因為太小而越界。舉個例子:
UInt8
的最小值是0
(二進製為00000000
)。使用&-
進行溢出減1,就會得到二進製的11111111
即十進製的255
。
Swift代碼是這樣的:
var willUnderflow = UInt8.min
// willUnderflow 等於UInt8的最小值0
willUnderflow = willUnderflow &- 1
// 此時 willUnderflow 等於 255
有符整型也有類似的下溢出,有符整型所有的減法也都是對包括在符號位在內的二進製數進行二進製減法的,這在 "按位左移/右移運算符" 一節提到過。最小的有符整數是-128
,即二進製的10000000
。用溢出減法減去去1後,變成了01111111
,即UInt8所能承載的最大整數127
。
來看看Swift代碼:
var signedUnderflow = Int8.min
// signedUnderflow 等於最小的有符整數 -128
signedUnderflow = signedUnderflow &- 1
// 如今 signedUnderflow 等於 127
除零溢出
一個數除於0 i / 0
,或者對0求餘數 i % 0
,就會產生一個錯誤。
let x = 1
let y = x / 0
使用它們對應的可溢出的版本的運算符&/
和&%
進行除0操作時就會得到0
值。
let x = 1
let y = x &/ 0
// y 等於 0