EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
这怎么可能?必须有某种溢出或这些函数的定义以奇怪的方式交织在一起。
答案 0 :(得分: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
永远不会返回负数。
答案 1 :(得分:5)
为了编码零,正/负二进制补码整数之间必然存在不对称性。
实际上,您正在看到整数溢出(饱和)。
答案 2 :(得分:2)
对于每种integer数据类型,您可以使用该类型表示最大和最小的数字:
当涉及整数的表达式的结果超出数据类型的最大值(或最小值)时,MATLAB将超出限制的值映射到最近的端点。这个saturation行为解释了你所看到的,而不是二进制表示中overflow的奇怪情况(在2的补码中“包裹”)。
示例:
>> x = int8(100)
x =
100
>> x + x
ans =
127