为什么在matlab中abs(intmin)〜= -intmin

Cac*_*AMF 9 matlab integer-overflow

EDU>> intmin 
    ans =

    -2147483648

EDU>> abs(intmin)

     ans =

     2147483647
Run Code Online (Sandbox Code Playgroud)

这怎么可能?必须存在某种溢出,或者这些函数的定义以奇怪的方式混合在一起.

小智 9

对于32位的2的补码有符号整数,intmin0x80000000,或者确实如此-2147483648.然而,intmax就是0x7FFFFFFF,这是唯一的2147483647.这意味着否定intmin将是2147483648,它不能用32位有符号整数表示.

MATLAB实际上做了一些奇怪的事.在2的补码的正常规则下,0 - 0x80000000应该再给0x80000000.然而,根据MATLAB, 0 - 0x80000000 = 0x7FFFFFFF.这应解释为什么abs(intmin) = intmax适用于MATLAB(但不一定适用于其他语言).

然而,这种奇怪的有一个有趣的副作用:你可以假设abs永远不会返回负数.


Bri*_*ain 5

为了编码零,正/负二进制补码整数之间必然存在不对称性.

实际上,您正在看到整数溢出(饱和).