默認(rèn)情況下,當(dāng)你往一個(gè)整型常量或變量賦于一個(gè)它不能承載的大數(shù)時(shí),Swift不會(huì)讓你這么干的,它會(huì)報(bào)錯(cuò)。這樣,在操作過(guò)大或過(guò)小的數(shù)的時(shí)候就很安全了。
例如,Int16整型能承載的整數(shù)范圍是-32768到32767,如果給它賦上超過(guò)這個(gè)范圍的數(shù),就會(huì)報(bào)錯(cuò):
var potentialOverflow = Int16.max
// potentialOverflow 等于 32767, 這是 Int16 能承載的最大整數(shù)
potentialOverflow += 1
// 噢, 出錯(cuò)了
對(duì)過(guò)大或過(guò)小的數(shù)值進(jìn)行錯(cuò)誤處理讓你的數(shù)值邊界條件更靈活。
當(dāng)然,你有意在溢出時(shí)對(duì)有效位進(jìn)行截?cái)?,你可采用溢出運(yùn)算,而非錯(cuò)誤處理。Swfit為整型計(jì)算提供了5個(gè)&符號(hào)開頭的溢出運(yùn)算符。
&+&-&*&/&%
下面例子使用了溢出加法&+來(lái)解剖的無(wú)符整數(shù)的上溢出
var willOverflow = UInt8.max
// willOverflow 等于UInt8的最大整數(shù) 255
willOverflow = willOverflow &+ 1
// 這時(shí)候 willOverflow 等于 0
willOverflow用Int8所能承載的最大值255(二進(jìn)制11111111),然后用&+加1。然后UInt8就無(wú)法表達(dá)這個(gè)新值的二進(jìn)制了,也就導(dǎo)致了這個(gè)新值上溢出了,大家可以看下圖。溢出后,新值在UInt8的承載范圍內(nèi)的那部分是00000000,也就是0。

數(shù)值也有可能因?yàn)樘《浇纭Ee個(gè)例子:
UInt8的最小值是0(二進(jìn)制為00000000)。使用&-進(jìn)行溢出減1,就會(huì)得到二進(jìn)制的11111111即十進(jìn)制的255。

Swift代碼是這樣的:
var willUnderflow = UInt8.min
// willUnderflow 等于UInt8的最小值0
willUnderflow = willUnderflow &- 1
// 此時(shí) willUnderflow 等于 255
有符整型也有類似的下溢出,有符整型所有的減法也都是對(duì)包括在符號(hào)位在內(nèi)的二進(jìn)制數(shù)進(jìn)行二進(jìn)制減法的,這在 "按位左移/右移運(yùn)算符" 一節(jié)提到過(guò)。最小的有符整數(shù)是-128,即二進(jìn)制的10000000。用溢出減法減去去1后,變成了01111111,即UInt8所能承載的最大整數(shù)127。

來(lái)看看Swift代碼:
var signedUnderflow = Int8.min
// signedUnderflow 等于最小的有符整數(shù) -128
signedUnderflow = signedUnderflow &- 1
// 如今 signedUnderflow 等于 127
一個(gè)數(shù)除于0 i / 0,或者對(duì)0求余數(shù) i % 0,就會(huì)產(chǎn)生一個(gè)錯(cuò)誤。
let x = 1
let y = x / 0
使用它們對(duì)應(yīng)的可溢出的版本的運(yùn)算符&/和&%進(jìn)行除0操作時(shí)就會(huì)得到上一篇:Swift字符串可變性下一篇:Swift結(jié)構(gòu)體和枚舉是值類型