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
广告