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