Swift溢位運算子

2021-07-22 22:26:30 字數 1965 閱讀 6162

預設情況下,當你往乙個整型常量或變數賦於乙個它不能承載的大數時,swift不會讓你這麼幹的,它會報錯。這樣,在操作過大或過小的數的時候就很安全了。

例如,int16整型能承載的整數範圍是-3276832767,如果給它賦上超過這個範圍的數,就會報錯:

var potentialoverflow = int16.max

// potentialoverflow 等於 32767, 這是 int16 能承載的最大整數

potentialoverflow += 1

// 噢, 出錯了

對過大或過小的數值進行錯誤處理讓你的數值邊界條件更靈活。

當然,你有意在溢位時對有效位進行截斷,你可採用溢位運算,而非錯誤處理。swfit為整型計算提供了5個&符號開頭的溢位運算子。

下面例子使用了溢位加法&+來解剖的無符整數的上溢位

var willoverflow = uint8.max

// willoverflow 等於uint8的最大整數 255

willoverflow = willoverflow &+ 1

// 這時候 willoverflow 等於 0

willoverflowint8所能承載的最大值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

乙個數除於0i / 0,或者對0求餘數i % 0,就會產生乙個錯誤。

let x = 1

let y = x / 0

使用它們對應的可溢位的版本的運算子&/&%進行除0操作時就會得到0值。

let x = 1

let y = x &/ 0

// y 等於 0

輸出運算子過載

程式的版權和版本宣告部分 檔名稱 test.cpp 作 者 任子儀 完成日期 2014年 4月 22日 版 本 號 v12.1 輸入描述 無 問題描述 程式輸出 問題分析 略 演算法設計 略 includeusing namespace std class complex complex doubl...

輸出運算子過載

cannot access protected member declared in class cricle 我遇到這種錯誤是在這種情況下 class cricle friend ostream operator ostream const cricle ostream operator ostr...

輸入和輸出運算子

通常情況下,輸出運算子第乙個形參是乙個非常量ostream物件的引用。之所以使用ostream是非常量是因為向流寫入內容會改變其狀態 而形參是引用是因為無法直接複製乙個ostream物件。第二個形參一般來說是乙個常量的引用,該常量表示想要列印的類型別。採用引用可以避免複製實參 之所以是常量是因為通常...