EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
這怎麼可能?必定會有某種溢出或這些函數的定義以奇怪的方式混合在一起。爲什麼abs(intmin)〜= -intmin在matlab中
EDU>> intmin
ans =
-2147483648
EDU>> abs(intmin)
ans =
2147483647
這怎麼可能?必定會有某種溢出或這些函數的定義以奇怪的方式混合在一起。爲什麼abs(intmin)〜= -intmin在matlab中
對於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
永遠不會返回負數。
非常感謝。你的回答非常明確。 –
MATLAB使用飽和度而不是你在C語言中看到的「環繞」行爲。除此之外,我認爲C中有符號整數的溢出是*未定義行爲* – Amro
爲了編碼零,在正/負二進制補碼整數中必須存在不對稱性。
事實上,你正在看到整數溢出(飽和)。
對於每個integer數據類型,存在可以與該類型表示最大和最小數:
當涉及整數表達式的結果超過最大(或最小)值的數據類型,MATLAB將超出極限的值映射到最近的端點。這個saturation的行爲解釋了你所看到的,而不是二進制表示中的一個奇怪的情況overflow(它以2的補碼「繞回」)。
實施例:
>> x = int8(100)
x =
100
>> x + x
ans =
127
檢查[二的補碼(http://en.wikipedia.org/wiki/Two's_complement)以及範圍爲32位的數字。 – plesiv