9
EDU>> intmin 
    ans =

    -2147483648

EDU>> abs(intmin)

     ans =

     2147483647

これはどのように可能ですか?なんらかのオーバーフローがあるか、これらの関数の定義が奇妙な方法で混在しているに違いありません。

4

3 に答える 3

9

32 ビットの 2 の補数の符号付き整数の場合、intminis 0x80000000、または実際には-2147483648. ただし、intmax0x7FFFFFFF、 のみ2147483647です。これは、 の否定が でintminあることを意味し、これ2147483648は 32 ビットの符号付き整数では表すことができません。

MATLAB は実際には奇妙なことをします。2 の補数の通常の規則では、再び0 - 0x80000000与える必要があります0x80000000。ただし、MATLAB によると、0 - 0x80000000 = 0x7FFFFFFF. これはabs(intmin) = intmax、MATLAB が当てはまる理由を説明するはずです (ただし、必ずしも他の言語ではそうではありません)。

ただし、この奇妙さには興味深い副作用がabsあります。 が負の数を返さないと仮定できます。

于 2013-06-30T20:03:04.683 に答える
5

ゼロをエンコードするには、正/負の 2 の補数の整数間に非対称性がなければなりません。

実際、整数オーバーフロー (飽和) が見られます。

于 2013-06-30T19:48:06.737 に答える
2

整数データ型ごとに、その型で表現できる最大数と最小数があります。

integer_type_range

整数を含む式の結果がデータ型の最大 (または最小) 値を超える場合、MATLAB は制限外の値を最も近い端点にマップします。この飽和動作は、バイナリ表現のオーバーフローの奇妙なケース(2 の補数で「ラップアラウンド」)ではなく、見ているものを説明しています。

例:

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