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

    -2147483648 

EDU>> abs(intmin) 

    ans = 

    2147483647 

Làm cách nào có thể? Phải có một số loại tràn hoặc định nghĩa của các chức năng này được trộn lẫn theo những cách kỳ lạ.Lý do abs (intmin) ~ = -intmin trong MATLAB

+4

Kiểm tra [Hai của bổ sung] (http://en.wikipedia.org/wiki/Two's_complement) và dao động cho số 32-bit. – plesiv

Trả lời

9

Đối với các số nguyên được bổ sung có số lượng là 32 bit, intmin0x80000000 hoặc thực sự là -2147483648. Tuy nhiên, intmax0x7FFFFFFF, chỉ là 2147483647. Điều này có nghĩa là phủ định của intmin sẽ là 2147483648, không thể được biểu thị bằng số nguyên được ký 32 bit.

MATLAB thực sự làm điều gì đó kỳ quặc. Theo các quy tắc thông thường của phần bổ sung 2, 0 - 0x80000000 sẽ cung cấp lại cho 0x80000000. Tuy nhiên, theo MATLAB, 0 - 0x80000000 = 0x7FFFFFFF. Điều này sẽ giải thích lý do tại sao abs(intmin) = intmax giữ cho MATLAB (nhưng không nhất thiết phải bằng các ngôn ngữ khác).

Sự kỳ quặc này có tác dụng phụ thú vị, tuy nhiên: bạn có thể giả định rằng abs không bao giờ trả về số âm.

+0

Cảm ơn bạn rất nhiều. Câu trả lời của bạn cực kỳ rõ ràng. –

+1

MATLAB sử dụng độ bão hòa thay vì hành vi "quấn quanh" mà bạn nhìn thấy bằng các ngôn ngữ như C. Bên cạnh đó tôi nghĩ rằng tràn các số nguyên đã ký trong C là * hành vi không xác định * – Amro

5

Để mã hóa số không, phải có sự bất đối xứng giữa số nguyên bổ sung của hai số dương/âm.

Thật vậy, bạn đang nhìn thấy tràn số nguyên (độ bão hòa).

2

Đối với mỗi loại integer dữ liệu, có một số lượng lớn nhất và nhỏ nhất mà bạn có thể biểu diễn với kiểu đó:

integer_type_range

Khi kết quả của một biểu thức liên quan đến số nguyên vượt quá (hoặc tối thiểu) giá trị lớn nhất của kiểu dữ liệu, MATLAB ánh xạ các giá trị nằm ngoài giới hạn tới điểm cuối gần nhất. Hành vi saturation này giải thích những gì bạn đang nhìn thấy hơn là một trường hợp kỳ lạ của overflow trong biểu diễn nhị phân (mà "bao bọc xung quanh" trong phần bổ sung của 2).

Ví dụ:

>> x = int8(100) 
x = 
    100 
>> x + x 
ans = 
    127 
Các vấn đề liên quan