为什么 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
而不是零。使用二进制补码表示,您只需将数字相加,就好像它们是无符号的一样,并获得正确的结果。
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
而不是零。使用二进制补码表示,您只需将数字相加,就好像它们是无符号的一样,并获得正确的结果。