为什么 Int8.max &+ Int8.max 等于“-2”?

问题描述

在 Swift 标准库 documentation 之后,&+ 丢弃任何溢出整数类型固定宽度的位。我只是不明白为什么将两个最大值相加,8 位有符号整数可以在 -2 中保存结果

/// Two max Int8 values (127 each,8-bit group)
let x6 = Int8.max
let x7 = Int8.max

/// Prints `1 1 1 1 1 1 1`
String(Int8.max,radix: 2)

/// Here we get `-2` in decimal system
let x8 = x6 &+ x7

/// Prints `-1 0`
String(x8,radix: 2)

如果我们分解二进制计算,我们将得到:

    1   1   1   1   1   1   1
+   1   1   1   1   1   1   1
-----------------------------
1   1   1   1   1   1   1   0

Which is -126,as the leftmost bit is a negative sign.

为什么 Swift 会丢弃除最右边的两个位(10)之外的任何位。我是否错过了一些溢出规则?我已经在网上阅读了一些知识,但并没有接近破解这一点。

解决方法

Swift(以及我知道的所有其他编程语言)使用 2's complement 来表示有符号整数,而不是您似乎假设的 sign-and-magnitude

在 2 的补码表示中,最左边的 1 不表示“负号”。您可以将其视为表示 -128,因此 -2 的 Int8 值将表示为 1111 1110 (-128 + 64 + 32 + 16 + 8 + 4 + 2)。

OTOH,-126 将表示为 1000 0010 (-128 + 2)。