问题描述
在 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 会丢弃除最右边的两个位(1
和 0
)之外的任何位。我是否错过了一些溢出规则?我已经在网上阅读了一些知识,但并没有接近破解这一点。
解决方法
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)。