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

Why UInt64.max / 2 + 1 represented in the memory the same as Int64 value -9 223 372 036 854 775 808 but not as -1?

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

由于 Swift 游乐场中的问题,您可以看出这是真的:Why is UInt64 max equal -1 in Swift?

var max = UInt64.max / 2 + 1 // playground shows -1 because it treats it as Int64 

是的,事实上 -1 并不是表示为带有符号位的 1,而是所有位都设置为 1。这称为 "two's complement" 表示,并在大多数现代处理器中使用。

在此处阅读更多相关信息:

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

其中一个原因是这样涉及负数和正数的算术运算更容易。如果 -1 表示为带有符号位的 1,并且我们试图以一种天真的方式向其添加 1,我们将得到带有符号位的 2 而不是零。使用二进制补码表示,您只需将数字相加,就好像它们是无符号的一样,并获得正确的结果。