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

时间:2013-06-30 19:41:37

标签: matlab integer-overflow

EDU>> intmin 
    ans =

    -2147483648

EDU>> abs(intmin)

     ans =

     2147483647

这怎么可能?必须有某种溢出或这些函数的定义以奇怪的方式交织在一起。

3 个答案:

答案 0 :(得分:9)

对于32位的2的补码有符号整数,intmin0x80000000,或者-2147483648。但是,intmax0x7FFFFFFF,仅为2147483647。这意味着intmin的否定将是2147483648,它不能用32位有符号整数表示。

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

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:2)

对于每种integer数据类型,您可以使用该类型表示最大和最小的数字:

integer_type_range

当涉及整数的表达式的结果超出数据类型的最大值(或最小值)时,MATLAB将超出限制的值映射到最近的端点。这个saturation行为解释了你所看到的,而不是二进制表示中overflow的奇怪情况(在2的补码中“包裹”)。

示例:

>> x = int8(100)
x =
  100
>> x + x
ans =
  127