Được rồi, vì vậy lý do đằng sau này đã được trả lời đã có, nhưng trong trường hợp bạn đã quan tâm đến một số nền tảng:
A bit
là đơn vị lưu trữ nhỏ nhất mà máy tính có thể nhận ra (nb không phải là số nhỏ nhất). Một bit là 0
hoặc 1
.
A byte
là loại dữ liệu 8 bit, có nghĩa là nó bao gồm 8 chuỗi bit như 10101010
hoặc 0001110
. Sử dụng tổ hợp đơn giản, chúng tôi biết rằng có sự kết hợp các byte có thể là 2^8 = 256
.
Nếu chúng tôi muốn chỉ đại diện cho số dương, chúng tôi có thể thực hiện chuyển đổi thẳng từ cơ sở 2 sang cơ sở 10. Cách hoạt động là, đối với một chuỗi bit b7b6b5b4b3b2b1b0
số thập phân là dec = sum from n=0 to 7 of (bn * 2^n)
.
Bằng cách chỉ đại diện cho số dương (một số unsigned byte
), chúng tôi có thể đại diện cho 256 số có thể trong phạm vi 0
đến 255
bao gồm.
Sự cố xảy ra khi chúng tôi muốn đại diện cho dữ liệu đã ký. Một cách tiếp cận ngây thơ (n.b. này là cho nền, không phải là cách java hiện nó) là để lấy phần lớn nhất bên trái và làm cho nó bit dấu nơi 1
là tiêu cực và 0
là tích cực. Vì vậy, ví dụ: 00010110
sẽ là 21
và 10010110
sẽ là -21
.
Có hai vấn đề lớn với hệ thống như vậy. Đầu tiên là 00000000
là 0
và 10000000
là -0
, nhưng như mọi người đều biết, không có -0
bằng cách nào đó khác với 0
, nhưng hệ thống như vậy cho phép số và 0 ≠ -0
. Vấn đề thứ hai là, do đại diện cho hai số không, hệ thống chỉ cho phép đại diện cho các số từ -127
đến 127
, một phạm vi chỉ có 254
(2
nhỏ hơn trước).
Một hệ thống tốt hơn nhiều (và hệ thống mà hầu hết hệ thống sử dụng) được gọi là Two's Compliment. Trong hai lời khen, số dương được biểu diễn bằng chuỗi bit bình thường của chúng ở nơi bit ngoài cùng bên trái là 0. Các số âm được biểu diễn bằng bit bên trái nhiều nhất là 1 và sau đó tính toán lời khen của hai cho số đó (từ đâu hệ thống lấy tên của nó)
Mặc dù về mặt toán học, nó là một quá trình phức tạp hơn một chút, bởi vì chúng ta đang xử lý số 2
có một số vết cắt ngắn. Về cơ bản, bạn có thể lấy phiên bản tích cực và (từ phải sang trái) lấy tất cả số 0 cho đến khi bạn nhấn 1. Sao chép những số 0 và một, sau đó lấy NOT
của phần còn lại của các bit. Ví dụ: để có được -21
, tích cực 21
là 00010110
, chúng tôi lấy số 10
và không còn lại để có được 11101010
, biểu thị lời khen của hai là -21
.
Hai của khen là một hệ thống nhiều khó khăn hơn để nắm bắt, nhưng nó tránh được những vấn đề đã nêu trước đây, và cho một số n-bit có thể đại diện cho tất cả các chữ số -2^(n-1)
-2^(n-1)-1
mà cho byte của chúng tôi có nghĩa -128
để 127
(do đó vấn đề trong câu hỏi này)
Một vài lưu ý:
- Đây chỉ là đại diện số nguyên. Biểu diễn số thực là một hệ thống hoàn toàn khác (nếu có yêu cầu, tôi chắc chắn chúng ta có thể tạo một bài CW đại diện số)
- Wikipedia có thêm một số hệ thống đại diện số nếu bạn quan tâm.
Ý của bạn là 'dường như là vô tận'? – Fermin
@ Suresh S: Bạn đã viết "byte có thể giữ chỉ lên đến 127 bit", mà thực sự là rất nhiều bit cho một byte để có ;-). – sleske
@joey oops !! lấy làm tiếc . –