9
EDU>> intmin 
    ans =

    -2147483648

EDU>> abs(intmin)

     ans =

     2147483647

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

4

3 回答 3

9

对于 2 的补码 32 位有符号整数,intminis0x80000000或确实-2147483648。然而,intmax0x7FFFFFFF,这只是2147483647。这意味着将的否定intmin2147483648,它不能用 32 位有符号整数表示。

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

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

于 2013-06-30T20:03:04.683 回答
5

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

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

于 2013-06-30T19:48:06.737 回答
2

对于每种整数数据类型,都有一个可以用该类型表示的最大和最小数字:

整数类型范围

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

例子:

>> x = int8(100)
x =
  100
>> x + x
ans =
  127
于 2013-07-02T13:40:14.953 回答