EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
这怎么可能?一定有某种溢出,或者这些函数的定义以奇怪的方式混合在一起。
EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
这怎么可能?一定有某种溢出,或者这些函数的定义以奇怪的方式混合在一起。
对于 2 的补码 32 位有符号整数,intminis0x80000000或确实-2147483648。然而,intmax是0x7FFFFFFF,这只是2147483647。这意味着将的否定intmin是2147483648,它不能用 32 位有符号整数表示。
MATLAB 实际上做了一些奇怪的事情。在 2 的补码的正常规则下,0 - 0x80000000应该0x80000000再次给出。然而,根据 MATLAB 0 - 0x80000000 = 0x7FFFFFFF,. 这应该解释为什么abs(intmin) = intmax适用于 MATLAB(但不一定适用于其他语言)。
然而,这种奇怪有一个有趣的副作用:你可以假设它abs永远不会返回负数。
为了编码零,正/负二进制补码整数之间必须存在不对称性。
实际上,您会看到整数溢出(饱和)。