为什么UInt64.max/2 + 1在内存中表示与Int64值相同-9 223 372 036 854 775 808但不是-1?

Dmi*_*try -8 memory cpu swift

UInt62.max/2在内存中由0100..0000表示.添加1,它将是0100..0001.所以,标志的第一位.我们拿-1.但CPU认为它是-9 223 372 036 854 775 808.为什么它如此复杂?

你可以看到它是真的,因为Swift游乐场中的问题:为什么在Swift中UInt64 max等于-1?

var max = UInt64.max / 2 + 1 // playground shows -1 because it treats it as Int64 
Run Code Online (Sandbox Code Playgroud)

Ish*_*ael 8

是的,实际上-1并没有1用符号位表示,而是将所有位设置为1.这被称为"二进制补码"表示,并且在大多数现代处理器中使用.

在这里阅读更多相关信息:

https://en.wikipedia.org/wiki/Two%27s_complement

其中一个原因是,这种涉及负数和正数的算术运算更容易.如果-1被描绘成1一个符号位,我们试图添加1到它在一个简单的方式,我们会得到2一个符号位而不是零.使用二进制补码表示,您只需添加数字就好像它们是无符号的一样,并获得正确的结果.

  • 为了扩展"它更容易"的部分,关键是这意味着相同的[ALU](https://en.wikipedia.org/wiki/Arithmetic_logic_unit)电路可用于加法和减法,计算加法为"ADD"( a,b,carry = 0)`和减法为`ADD(a,~b,carry = 1)`. (2认同)