Cac*_*AMF 9 matlab integer-overflow
EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
Run Code Online (Sandbox Code Playgroud)
这怎么可能?必须存在某种溢出,或者这些函数的定义以奇怪的方式混合在一起.
小智 9
对于32位的2的补码有符号整数,intmin是0x80000000,或者确实如此-2147483648.然而,intmax就是0x7FFFFFFF,这是唯一的2147483647.这意味着否定intmin将是2147483648,它不能用32位有符号整数表示.
MATLAB实际上做了一些奇怪的事.在2的补码的正常规则下,0 - 0x80000000应该再给0x80000000.然而,根据MATLAB, 0 - 0x80000000 = 0x7FFFFFFF.这应解释为什么abs(intmin) = intmax适用于MATLAB(但不一定适用于其他语言).
然而,这种奇怪的有一个有趣的副作用:你可以假设abs永远不会返回负数.