Swift - 算術溢位運算子



算術溢位運算子是一種特殊的運算子,用於對整數型別執行算術運算並高效地處理溢位。當我們需要執行可能超過給定整數最大或最小範圍的計算時,通常會使用它們。

例如,我們正在新增兩個 Int8 型別的整數,它們超過了 Int8 的最大範圍(-128 到 127)。因此,如果我們使用普通的加法運算子“+”,我們將得到一個錯誤,因為我們不允許在 Int8 中儲存大於最大值或最小值的數字,但使用算術溢位運算子,我們可以輕鬆地溢位 Int8 的最小值和最大值而不會出現任何錯誤。

Swift 支援三種類型的算術溢位運算子:

運算子 名稱 示例
&+ 溢位加法 X &+ Y
&- 溢位減法 X &- Y
&* 溢位乘法 X &* Y

溢位值

在瞭解溢位運算子的工作原理之前,我們首先了解什麼是溢位值。眾所周知,整數具有特定的範圍,包括最小值和最大值,例如 Int8 可以儲存 -128 到 127 之間的值。

因此,溢位值表示超過給定整數的最小或最大範圍的值。這通常發生在使用溢位算術運算子時。

我們可以使有符號和無符號整數溢位。當我們向正方向溢位時,它將從最大有效整數值環繞到最小值,而當我們向負方向溢位時,它將從最小有效整數值環繞到最大值。

示例

var num = UInt8.max
num = num &+ 1

這裡,一個無符號整數在 &+ 運算子的幫助下向正方向溢位,因為 UInt8 的最大值為 255 或二進位制表示為 11111111。

現在我們將 1 新增到 num,這將超過其最大值。因此,此溢位透過環繞到 UInt8 的最小可表示值 0 來處理。

Swift 中的溢位加法 "&+"

溢位加法“&+”運算子用於新增兩個整數並進行溢位檢查。如果發生任何溢位,它將正確地處理它,而不會導致程式出錯。此運算子可以與有符號和無符號整數一起使用。

語法

以下是溢位加法運算子的語法:

var value = x &+ b

示例

Swift 程式計算兩個 Int8 型別整數的和。

import Foundation

// Defining integer data type
let num1 : Int8 = 110
let num2 : Int8 = 30

// Calculate the sum using the normal addition operator
var sum = num1 + num2

print("Sum of \(num1) and \(num2) = \(sum)")

輸出

Stack dump:
0.	Program arguments: /opt/swift/bin/swift-frontend -frontend -interpret main.swift -disable-objc-interop -color-diagnostics -new-driver-path /opt/swift/bin/swift-driver -empty-abi-descriptor -resource-dir /opt/swift/lib/swift -module-name main
1.	Swift version 5.7.3 (swift-5.7.3-RELEASE)
2.	Compiling with the current language version
3.	While running user code "main.swift"
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
/opt/swift/bin/swift-frontend(+0x551a103)[0x55731fee8103]
/opt/swift/bin/swift-frontend(+0x551802e)[0x55731fee602e]
/opt/swift/bin/swift-frontend(+0x551a48a)[0x55731fee848a]
/lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7f138af33520]
[0x7f1389bea35f]
/opt/swift/bin/swift-frontend(+0x1940b3d)[0x55731c30eb3d]
/opt/swift/bin/swift-frontend(+0xc74db9)[0x55731b642db9]
/opt/swift/bin/swift-frontend(+0xa454c6)[0x55731b4134c6]
/opt/swift/bin/swift-frontend(+0xa419b6)[0x55731b40f9b6]
/opt/swift/bin/swift-frontend(+0xa410a7)[0x55731b40f0a7]
/opt/swift/bin/swift-frontend(+0xa4341e)[0x55731b41141e]
/opt/swift/bin/swift-frontend(+0xa4273d)[0x55731b41073d]
/opt/swift/bin/swift-frontend(+0x914a39)[0x55731b2e2a39]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90)[0x7f138af1ad90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80)[0x7f138af1ae40]
/opt/swift/bin/swift-frontend(+0x914295)[0x55731b2e2295]
Illegal instruction (core dumped)

但我們得到了一個錯誤,因為結果值將超過 Int8 的最大範圍。因此,為了克服此問題,我們將使用加法溢位運算子“&+”。此運算子將新增它們,而不會產生錯誤。

import Foundation

// Defining integer data type
let num1 : Int8 = 110
let num2 : Int8 = 30

// Calculate the sum using the addition overflow operator
var sum = num1 &+ num2

print("Sum of \(num1) and \(num2) = \(sum)")

輸出

Sum of 110 and 30 = -116

Swift 中的溢位減法 "&-"

溢位加法“&-”運算子用於減去兩個整數並進行溢位檢查。如果發生任何溢位,它將正確地處理它,而不會導致出錯。它適用於有符號和無符號整數。

語法

以下是溢位減法運算子的語法:

var value = x &- b

示例

Swift 程式減去兩個無符號整數。

import Foundation

// Defining unsigned integer data type
let num1 : UInt8 = 54
let num2 : UInt8 = 90

// Subtract integers using the normal subtraction operator
var sum = num1 - num2

print("\(num1) - \(num2) = \(sum)")

輸出

Stack dump:
0.	Program arguments: /opt/swift/bin/swift-frontend -frontend -interpret main.swift -disable-objc-interop -color-diagnostics -new-driver-path /opt/swift/bin/swift-driver -empty-abi-descriptor -resource-dir /opt/swift/lib/swift -module-name main
1.	Swift version 5.7.3 (swift-5.7.3-RELEASE)
2.	Compiling with the current language version
3.	While running user code "main.swift"
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
/opt/swift/bin/swift-frontend(+0x551a103)[0x55736aebe103]
/opt/swift/bin/swift-frontend(+0x551802e)[0x55736aebc02e]
/opt/swift/bin/swift-frontend(+0x551a48a)[0x55736aebe48a]
/lib/x86_64-linux-gnu/libc.so.6(+0x42520)[0x7f575ce12520]
[0x7f575bac936c]
/opt/swift/bin/swift-frontend(+0x1940b3d)[0x5573672e4b3d]
/opt/swift/bin/swift-frontend(+0xc74db9)[0x557366618db9]
/opt/swift/bin/swift-frontend(+0xa454c6)[0x5573663e94c6]
/opt/swift/bin/swift-frontend(+0xa419b6)[0x5573663e59b6]
/opt/swift/bin/swift-frontend(+0xa410a7)[0x5573663e50a7]
/opt/swift/bin/swift-frontend(+0xa4341e)[0x5573663e741e]
/opt/swift/bin/swift-frontend(+0xa4273d)[0x5573663e673d]
/opt/swift/bin/swift-frontend(+0x914a39)[0x5573662b8a39]
/lib/x86_64-linux-gnu/libc.so.6(+0x29d90)[0x7f575cdf9d90]
/lib/x86_64-linux-gnu/libc.so.6(__libc_start_main+0x80)[0x7f575cdf9e40]
/opt/swift/bin/swift-frontend(+0x914295)[0x5573662b8295]
Illegal instruction (core dumped)

同樣,我們得到了一個錯誤,因為它超出了範圍。因此,為了減去兩個無符號整數,我們將使用減法溢位“&-”運算子,它將減去它們,即使它們的範圍超過了,也不會產生任何錯誤。

import Foundation

// Defining unsigned integer data type
let num1 : UInt8 = 54
let num2 : UInt8 = 90

// Subtract integers using the subtraction overflow operator
var sum = num1 &- num2

print("\(num1) - \(num2) = \(sum)")

輸出

54 - 90 = 220

Swift 中的溢位乘法(&*)

溢位乘法“& *”運算子用於找到兩個整數的乘積並進行溢位檢查。如果發生任何溢位,它將正確地處理它,而不會導致出錯。它適用於有符號和無符號整數。

語法

以下是溢位乘法運算子的語法:

var value = x &* b

示例

Swift 程式使用乘法溢位“& *”運算子計算兩個有符號整數的乘積。

import Foundation

// Defining integer data type
let num1 : Int8 = 54
let num2 : Int8 = 90

// Calculate the product of two integers using the multiplication overflow operator
var sum = num1 &* num2

print("Product of \(num1) and \(num2) = \(sum)")

輸出

Product of 54 and 90 = -4
廣告