2013-06-30 37 views
9
EDU>> intmin 
    ans = 

    -2147483648 

EDU>> abs(intmin) 

    ans = 

    2147483647 

這怎麼可能?必定會有某種溢出或這些函數的定義以奇怪的方式混合在一起。爲什麼abs(intmin)〜= -intmin在matlab中

+4

檢查[二的補碼(http://en.wikipedia.org/wiki/Two's_complement)以及範圍爲32位的數字。 – plesiv

回答

9

對於32位的2的補碼有符號整數,intmin0x80000000或實際上-2147483648。但是,intmax0x7FFFFFFF,它只是2147483647。這意味着intmin的否定將是2147483648,它不能用32位有符號整數表示。

MATLAB實際上做了一些奇怪的事情。根據2的補充規則,0 - 0x80000000應該再次給出0x80000000。但是,根據MATLAB,0 - 0x80000000 = 0x7FFFFFFF。這應該解釋爲什麼abs(intmin) = intmax適用於MATLAB(但不一定用其他語言)。

然而,這種古怪有一個有趣的副作用:您可以假設abs永遠不會返回負數。

+0

非常感謝。你的回答非常明確。 –

+1

MATLAB使用飽和度而不是你在C語言中看到的「環繞」行爲。除此之外,我認爲C中有符號整數的溢出是*未定義行爲* – Amro

5

爲了編碼零,在正/負二進制補碼整數中必須存在不對稱性。

事實上,你正在看到整數溢出(飽和)。

2

對於每個integer數據類型,存在可以與該類型表示最大和最小數:

integer_type_range

當涉及整數表達式的結果超過最大(或最小)值的數據類型,MATLAB將超出極限的值映射到最近的端點。這個saturation的行爲解釋了你所看到的,而不是二進制表示中的一個奇怪的情況overflow(它以2的補碼「繞回」)。

實施例:

>> x = int8(100) 
x = 
    100 
>> x + x 
ans = 
    127