Giá trị ký âm được lưu trữ như thế nào?


12

Tôi đã xem video này về các giá trị tối đa và tối thiểu của các số nguyên đã ký.

Lấy một ví dụ về giá trị được ký dương - 0000 0001 Bit đầu tiên biểu thị rằng số đó là dương và 7 bit cuối cùng là chính số đó. Vì vậy, nó dễ dàng được hiểu là +1.

Bây giờ hãy lấy một ví dụ về giá trị được ký âm - 1000 0000 xuất hiện là -8. Được rồi, máy tính có thể hiểu rằng đó là một giá trị âm vì bit đầu tiên nhưng làm thế quái nào nó hiểu rằng 000 0000 có nghĩa là -8?

Nói chung, các giá trị ký âm được lưu trữ / diễn giải trong máy tính như thế nào?


nl.wikipedia.org/wiki/Two%27s_compuity là cách số nhị phân được lưu trữ trong máy tính.
Pieter B

@PieterB Có lẽ máy tính của bạn. Và rất nhiều người khác. Vì lý do chính đáng! Nhưng đừng ám chỉ đó là cách duy nhất.
gạch dưới

Dù sao bạn cũng thích. Tôi có thể nghĩ ra ít nhất 256! cách lưu trữ số nhị phân (8 bit) trên máy tính. Tuy nhiên hầu hết trong số đó là vô cùng ngớ ngẩn.
Caleth

C không chỉ định, phần lớn là cách nhà sản xuất chip quyết định đại diện cho dữ liệu. C được biên dịch thành mã máy và cần chú ý không xác định lại cách thức con chip lưu trữ số. Quy tắc tương tự áp dụng cho số dấu phẩy động. Tùy thuộc vào nhà sản xuất chip để xác định cách chúng được lưu trữ. Hầu hết các nhà sản xuất chip sử dụng phần bù 2, nhưng tôi chắc chắn có ngoại lệ.
Berin Loritsch

Câu trả lời:


28

Tiêu chuẩn C không bắt buộc bất kỳ cách cụ thể nào để biểu thị các số đã ký âm.

Trong hầu hết các triển khai mà bạn có khả năng gặp phải, số nguyên có dấu âm được lưu trữ trong phần được gọi là phần bù hai . Cách chính khác để lưu trữ các số đã ký âm được gọi là phần bù của một người .

Phần bù của hai số N-bit xđược định nghĩa là 2^N - x. Ví dụ, phần bù 8 bit của hai bit 12^8 - 1, hoặc 1111 1111. Phần bù 8 bit của hai bit 82^8 - 8, trong nhị phân là 1111 1000. Điều này cũng có thể được tính bằng cách lật các bit của xvà thêm một. Ví dụ:

 1      = 0000 0001
~1      = 1111 1110
~1 + 1  = 1111 1111
-1      = 1111 1111

 21     = 0001 0101
~21     = 1110 1010
~21 + 1 = 1110 1011
-21     = 1110 1011

Về cơ bản, phần bù của một số N bit x được định nghĩa là x với tất cả các bit của nó được lật.

 1      = 0000 0001
-1      = 1111 1110

 21     = 0001 0101
-21     = 1110 1010

Bổ sung của hai có một số lợi thế so với bổ sung của một. Ví dụ: nó không có khái niệm 'số 0 âm', vì lý do chính đáng là khó hiểu với nhiều người. Phép cộng, phép nhân và phép trừ hoạt động giống nhau với các số nguyên đã ký được triển khai với hai số được bổ sung giống như các số nguyên không dấu.


18

Có ba phương pháp nổi tiếng để biểu diễn các giá trị âm trong nhị phân:

  1. Ký độ lớn . Đây là cách dễ hiểu nhất, bởi vì nó hoạt động giống như chúng ta thường sử dụng khi xử lý các giá trị thập phân âm: Vị trí đầu tiên (bit) đại diện cho dấu (0 cho dương, 1 cho âm) và các bit khác đại diện cho số . Mặc dù chúng ta dễ hiểu, nhưng máy tính khó làm việc, đặc biệt là khi làm số học với số âm.
    Trong cường độ được ký 8 bit, giá trị 8 được biểu thị là 0 0001000 và -8 là 1 0001000.

  2. Bổ sung của một người . Trong biểu diễn này, các số âm được tạo ra từ số dương tương ứng bằng cách lật tất cả các bit và không chỉ bit dấu. Điều này giúp làm việc dễ dàng hơn với các số âm cho máy tính, nhưng có một điều phức tạp là có hai biểu diễn riêng biệt cho +0 và -0. Việc lật tất cả các bit làm cho điều này trở nên khó hiểu hơn đối với con người.
    Trong phần bù 8 bit của một người, giá trị 8 được biểu thị là 00001000 và -8 là 11110111.

  3. Bổ sung của hai . Đây là đại diện phổ biến nhất được sử dụng hiện nay cho các số nguyên âm vì nó dễ làm việc nhất với máy tính, nhưng nó cũng khó hiểu nhất đối với con người. Khi so sánh các mẫu bit được sử dụng cho các giá trị âm giữa phần bù của một và phần bù của hai phần, có thể thấy rằng cùng một mẫu bit trong phần bù của hai phần mã hóa cho số thấp hơn tiếp theo. Ví dụ: 11111111 là viết tắt của -0 trong phần bù của một người và cho -1 trong phần bù hai, và tương tự cho 10000000 (-127 so với -128).
    Trong phần bù hai bit 8 bit, giá trị 8 được biểu thị là 00001000 và -8 là 11111000.


8
Ký hiệu cường độ cũng có hai số không.
Jörg W Mittag

+1 để đề cập đến dấu hiệu / cường độ. không phổ biến và bất tiện (đối với CPU nếu không phải là con người!), nhưng đáng để biết.
gạch dưới

Hầu như tất cả chúng ta làm việc với cường độ đã ký, đặc biệt là với số FP.
Paulo1205

2

Các số nguyên đã ký được lưu trữ bằng cách sử dụng http://en.wikipedia.org/wiki/Two%27s%20compuity

Sau đó, bạn nhận được:

000   0
001   1
010   2
011   3
100   -4
101   -3
110   -2
111   -1

Về cơ bản, nó rất dễ đếm, bạn đếm đến một nửa số nguyên đã ký. Thực hiện +1, làm cho nó tiêu cực và bắt đầu đếm ngược.

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.