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

Swift 为什么在内存中表示的UInt64.max/2+1与Int64值-9 223 372 036 854 775 808相同,而不是-1?,swift,memory,cpu,Swift,Memory,Cpu,UInt62.max/2在内存中由0100..0000表示。加上1,它将是0100..0001。所以,标志的第一位。我们拿-1。但是CPU认为它是-9223 372 036 854 775 808。为什么它的工作如此复杂 你可以看到这是事实,因为Swift操场上的问题: 是的,事实上-1并不是用符号位表示为1,而是表示为所有设置为1的位。这被称为二的补码表示,在大多数现代处理器中使用 请在此处阅读更多信息: 其中一个原因是,通过这种方式,涉及负数和正数的算术运算更容易。如果将-1表示为带符号位的

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

你可以看到这是事实,因为Swift操场上的问题:

是的,事实上-1并不是用符号位表示为1,而是表示为所有设置为1的位。这被称为二的补码表示,在大多数现代处理器中使用

请在此处阅读更多信息:


其中一个原因是,通过这种方式,涉及负数和正数的算术运算更容易。如果将-1表示为带符号位的1,并且我们尝试以一种简单的方式将1添加到其中,那么将得到带符号位的2,而不是零。使用2的补码表示法,您只需将数字相加,就像它们是无符号的一样,就可以得到正确的结果。

什么?你能用一些代码演示一下吗?你最好回答这个有趣的问题,但不要投反对票。看看2的补码表示法。UInt62.max/2在内存中用1000..0000表示不,不是。这不是一个有趣的问题,你需要做一些关于数字的实际表示和可能的记忆中的其他东西的研究。还有大小if int,uint,UInt64,Int64。另请参见它也使数学上的as-1>-2 so-1应该有一个更大的位模式。更简单的是,关键的是,这意味着相同的电路可以用于加法和减法,将加法计算为ADDa,b,进位=0,将减法计算为ADDa,~b,进位=1。还有一些关于堆栈溢出的解释。UInt64中没有-1
var max = UInt64.max / 2 + 1 // playground shows -1 because it treats it as Int64