Bỏ qua tất cả những người đang nói với bạn rằng bit trên cùng là bit dấu. Đó là cách sai lầm để suy nghĩ về nó.
Cách đúng để suy nghĩ về nó là:
- Chúng tôi có 65.536 mẫu bit có thể.
- Vì vậy, chúng tôi có thể đại diện cho 65536 số có thể.
- Chúng tôi phải có một bản đồ gán có nghĩa là cho mỗi mẫu bit.
Đối với quần short unsigned, chúng ta gán mẫu bit như sau:
0000000000000000 --> 0
0000000000000001 --> 1
...
0111111111111111 --> 32767
1000000000000000 --> 32768
1000000000000001 --> 32769
...
1111111111111111 --> 65535
Đối ký quần short, chúng tôi sử dụng quy ước sau:
0000000000000000 --> 0
0000000000000001 --> 1
...
0111111111111111 --> 32767
1000000000000000 --> -32768
1000000000000001 --> -32767
...
1111111111111111 --> -1
đơn giản như vậy.
Tại sao chúng ta sử dụng quy ước này?
Ba lý do:
(1) Các 32K giá trị đầu tiên là như nhau cho dù bạn đang ký kết hoặc unsigned. Điều đó rất thuận tiện.
(2) Trong cả hai quy ước, "tất cả bit không" có nghĩa là không.
(3) Vì tính năng bổ sung hoạt động chính xác như nhau trong cả hai quy ước!
Chúng tôi có
0000000000000000 --> 0
và chúng tôi muốn thêm một. Chúng tôi thêm một bằng cách sử dụng quy tắc nhị phân và chúng tôi nhận được:
0000000000000001 --> 1
Điều này hoạt động cho dù đoạn mã ngắn được ký hoặc chưa ký.
Chúng tôi có unsigned ngắn:
1000000000000000 --> 32768
Chúng tôi muốn thêm một. Chúng tôi làm như vậy bằng cách sử dụng quy tắc nhị phân và chúng tôi nhận được câu trả lời đúng:
1000000000000001 --> 32769
Tương tự cho quần short có chữ ký. Chúng tôi có
1000000000000000 --> -32768
và chúng tôi muốn thêm. Chúng tôi làm như vậy với quy tắc nhị phân và chúng tôi nhận được:
1000000000000001 --> -32767
Tương tự như vậy, bạn có thể xác minh rằng bằng cách thêm 1111111111111111
cho bất kỳ số nhị phân, bạn nhận được "một ít", và do đó trừ của một công trình cũng như bổ sung một . Sau đó bạn có thể tiếp tục cho thấy rằng nói chung, phép cộng và phép trừ giống nhau trong cả số học đã ký và unsigned, có nghĩa là bộ vi xử lý không phải biết trình biên dịch có nghĩ rằng các giá trị được ký hoặc không được ký.
Đó là lý do tại sao chúng tôi sử dụng bổ sung twos: vì toán cơ bản giống hệt nhau cho dù bạn đang thực hiện số học đã ký hoặc chưa ký.
Lưu ý rằng tôi không nói gì về "bit dấu" trong đó. Thực tế là bit cao được thiết lập cho số âm chỉ là một phần thưởng tốt đẹp. Bất động sản chúng tôi muốn là chỉ phải xây dựng phần cứng để làm toán một lần.
Bổ sung Twos là chỉ là một quy ước để gán một trong hai ý nghĩa có thể cho các mẫu bit dựa trên loại được liên kết với biến giữ mẫu bit. Là một ngành, chúng tôi đã chọn quy ước này bởi vì nó rẻ để tạo ra phần cứng hiệu suất cao sử dụng quy ước này.
Có rất nhiều công ước khác mà chúng tôi có thể đã chọn. Ví dụ, chúng ta có thể nói rằng đối với số ký chúng tôi sử dụng bản đồ:
0000000000000000 --> -32768
0000000000000001 --> -32767
...
0111111111111111 --> -1
1000000000000000 --> 0
1000000000000001 --> 1
...
1111111111111111 --> 32767
Chú ý rằng đây là chính xác giống như trước trừ các bit đầu!
Trong cách diễn giải này, việc thêm vẫn hoạt động như chúng tôi mong đợi. Nhưng bản đồ này không có tài sản mà các giá trị 32K đầu tiên là giống nhau giữa ngắn và ushort, và nó không có tài sản mà tất cả các bit bằng không có nghĩa là số không. Vì vậy, chúng tôi không sử dụng quy ước này, bởi vì nó là ít thuận tiện hơn. Trong quy ước này, việc chuyển đổi từ ngắn thành ushort sẽ yêu cầu bổ sung. Đặt giá trị ngắn thành 0 sẽ yêu cầu đặt byte thành thứ khác 0. Chúng ta có thể sử dụng một quy ước nơi các con số đã ký được "theo thứ tự", chúng ta không chỉ vì nó là đau đớn để làm như vậy.
Bạn quên mất tài khoản cho bit dấu. –
Tôi không hiểu :(, bạn có thể giải thích được không? – Shabubble
Trên các giá trị đã ký, một bit (MSB) được dành riêng làm bit dấu, để cho biết số có dương hay âm hay không. có phải là số âm hay không? Bạn không cần phải tính toán số bit cần phải có mặt –