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
永远不会返回负数.