EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
これはどのように可能ですか?なんらかのオーバーフローがあるか、これらの関数の定義が奇妙な方法で混在しているに違いありません。
EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
これはどのように可能ですか?なんらかのオーバーフローがあるか、これらの関数の定義が奇妙な方法で混在しているに違いありません。
32 ビットの 2 の補数の符号付き整数の場合、intmin
is 0x80000000
、または実際には-2147483648
. ただし、intmax
は0x7FFFFFFF
、 のみ2147483647
です。これは、 の否定が でintmin
あることを意味し、これ2147483648
は 32 ビットの符号付き整数では表すことができません。
MATLAB は実際には奇妙なことをします。2 の補数の通常の規則では、再び0 - 0x80000000
与える必要があります0x80000000
。ただし、MATLAB によると、0 - 0x80000000 = 0x7FFFFFFF
. これはabs(intmin) = intmax
、MATLAB が当てはまる理由を説明するはずです (ただし、必ずしも他の言語ではそうではありません)。
ただし、この奇妙さには興味深い副作用がabs
あります。 が負の数を返さないと仮定できます。
ゼロをエンコードするには、正/負の 2 の補数の整数間に非対称性がなければなりません。
実際、整数オーバーフロー (飽和) が見られます。
整数データ型ごとに、その型で表現できる最大数と最小数があります。
整数を含む式の結果がデータ型の最大 (または最小) 値を超える場合、MATLAB は制限外の値を最も近い端点にマップします。この飽和動作は、バイナリ表現のオーバーフローの奇妙なケース(2 の補数で「ラップアラウンド」)ではなく、見ているものを説明しています。
例:
>> x = int8(100)
x =
100
>> x + x
ans =
127