为什么 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 会丢弃除了最右边的两位(1
和 0
)之外的任何位。我错过了一些溢出规则吗?在网上看了一些知识,但是没能破解这个。
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)。
遵循 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 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)。