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

Why Int8.max &+ Int8.max equals to "-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 to represent signed integers, rather than sign-and-magnitude,正如您所假设的那样。

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

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