Tại sao giá trị tối thiểu của ints, nhân đôi, v.v ... 1 xa hơn 0 so với giá trị dương?


10

Tôi biết nó có liên quan đến phần bù 2 và thêm 1, nhưng tôi không thực sự hiểu làm thế nào bạn có thể mã hóa thêm một số với cùng số bit khi nói đến số âm.


3
Phần thực sự khó chịu của điều này là abs (MinValue) âm tính.
OldFart

1
trong java Double.MIN_VALUE là giá trị dương nhỏ nhất và các số (thực) cách xa số 0 nhất có độ lớn bằng nhau (vì nó có một bit dấu thích hợp)
ratchet freak

Câu trả lời:


16

Hãy suy nghĩ về nó trong những điều khoản. Lấy số 2 bit có dấu trước:

000 = 0
001 = 1
010 = 2
011 = 3

Bây giờ chúng ta hãy có một số tiêu cực:

111 = -1
110 = -2
101 = -3

Đợi đã, chúng ta cũng có

100 ... 

Nó phải là số âm, bởi vì bit-bit là 1. Vì vậy, về mặt logic, nó phải là -4.

(Chỉnh sửa: Như WorldEngineer chỉ ra một cách đúng đắn , không phải tất cả các hệ thống đánh số đều hoạt động theo cách này - mà là những hệ thống bạn đang hỏi về.)


11

Bởi vì không có hai loại số trong phạm vi số nguyên, mà là ba: số âm, số 0 và số dương. Zero phải chiếm một vị trí (sẽ không thực tế nếu không thể đại diện cho số 0 ...), do đó, lớp dương hoặc lớp âm phải từ bỏ một vị trí. Thực tế thường là phạm vi tích cực phải thực hiện sự hy sinh đó ở một mức độ nhất định tùy ý, nhưng ở mức độ thao túng bit, có một số điều mà quyết định này giúp thuận tiện hơn.


Đó không chỉ là thao tác bit. Tập hợp các số có chữ ký 32 bit là tập hợp các số có biểu diễn nhị phân có cùng giá trị trong tất cả các bit sau ngày 31 và một số như vậy có một tập hợp vô hạn gồm 31 số không. Nghịch đảo cộng gộp của số đó, một chuỗi số 0 vô hạn được theo sau bởi một số 0 và 31 duy nhất, không phù hợp với mẫu yêu cầu của các giá trị đã ký.
supercat

4

Có ba cách cơ bản để biểu diễn các số nguyên đã ký trong nhị phân: phần bù 2, phần bù 1 và độ lớn ký hiệu. (Biquinary đã đi theo cách của Dodo Bird từ lâu.)

Bổ sung và cường độ ký hiệu của 1 có hai giá trị 0, +0 và -0, mỗi giá trị có một đại diện duy nhất. Bổ sung của 2 chỉ có một giá trị 0 và một đại diện.

Bây giờ, một trường gồm các bit N có thể mã hóa 2 ^ N giá trị. Trừ phần bù một trong 2 và bạn có 2 ^ N-1 = 2 ^ (N-1) + 2 ^ (N-1) + 1. Vì biểu diễn cho số 0 là tất cả các bit 0 và dấu + là 0, sẽ có thêm một đại diện khác không có thể với bit dấu được đặt thành 1.

Đây là một cách rất dài để nói phần bù của 2 đại diện cho các giá trị trong phạm vi - (2 ^ (N-1)) .. + (2 ^ (N-1) - 1).

Phần bù 1 thực sự có lợi thế hơn phần bù 2 nếu bạn đang thực hiện các tính toán xử lý tín hiệu số nguyên. Hoạt động bổ sung của 1 vốn đã bị cắt ngắn về không. Bổ sung của 2 cắt ngắn về phía vô cực. Tôi đã học được điều này theo cách CỨNG ...

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.