为啥 Int8.max &+ Int8.max 等于“-2”?
Posted
技术标签:
【中文标题】为啥 Int8.max &+ Int8.max 等于“-2”?【英文标题】:Why Int8.max &+ Int8.max equals to "-2"?为什么 Int8.max &+ Int8.max 等于“-2”? 【发布时间】:2021-07-12 01:54:31 【问题描述】:遵循 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
)之外的任何位。我错过了一些溢出规则吗?我在网上阅读了一些知识,但没有接近破解这一点。
【问题讨论】:
【参考方案1】: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)。
【讨论】:
@DmitryAksyonov 嗯,这是有点不清楚,不是吗?我的意思是说“否定”,因为它不代表-
符号。希望编辑后更清楚:)
好的,谢谢你的澄清。我发现我应该研究 2 的补码这个东西,因为我现在完全没有主题。
哦,是的,我明白了,这只是表示负值(例如(2 pow n)* -1
),但也感谢它:)顺便说一句,我认为这是一个非常好的piece 2 的补码,我'现在要彻底(第 17-33 页)。看看它有多深,哇。以上是关于为啥 Int8.max &+ Int8.max 等于“-2”?的主要内容,如果未能解决你的问题,请参考以下文章