Bạn có thể chuyển đổi thập phân thành nhị phân và nhị phân thành thập phân. Nhưng làm thế nào bạn có thể đại diện cho số "256"?
255 = 11111111
1 byte không thể có nhiều hơn 8 chữ số nhị phân (bit). Sao có thể như thế được?
Bạn có thể chuyển đổi thập phân thành nhị phân và nhị phân thành thập phân. Nhưng làm thế nào bạn có thể đại diện cho số "256"?
255 = 11111111
1 byte không thể có nhiều hơn 8 chữ số nhị phân (bit). Sao có thể như thế được?
Câu trả lời:
Bạn hỏi cách biểu diễn 256 ở dạng nhị phân, nhưng tôi đoán bạn đang thắc mắc tại sao mọi người nói byte có thể lưu trữ 256 số khác nhau, khi số lớn nhất mà nó lưu trữ là 255. Như Claudiop đã nói, máy tính bắt đầu đếm từ 0, vì vậy 0 thực sự là số thứ nhất, 1 là số thứ hai, 2 là số thứ ba ... 255 là số thứ 256.
Ngoài ra, 11111111 chỉ là 255 cho các byte không dấu. Khi bạn có một byte đã ký (một giá trị được ký là một byte có thể giữ các giá trị âm), 11111111 thực sự là -1. Xem http://en.wikipedia.org/wiki/Two_compuity . Cách bổ sung của hai hoạt động, thêm số âm vào số dương cho kết quả bằng 0. Như những người khác đã nói, nếu chúng tôi thêm một chút vào 11111111 và kiểu dữ liệu của bạn chỉ có thể hỗ trợ 8 bit, bit cuối cùng sẽ tràn ra và để lại cho bạn 0. Đối với các byte đã ký, các giá trị nằm trong phạm vi từ -128 đến 127. 128 số âm + 0 + 127 số dương = tổng 256 số.
Đối với các giá trị đã ký, bit đầu tiên là bit "dấu". Nếu bit này được đặt, số âm. 10000000 là âm, 01000000 là dương, 11111111 là âm, 01111111 là dương ...
Nếu bạn đang ở trên windows (có thể mac cũng vậy), bạn có thể mở máy tính, chuyển nó sang chế độ lập trình viên, chọn sbyte và chơi xung quanh với các bit để xem chúng tương quan với biểu diễn thập phân của chúng như thế nào.
Vâng, bạn cần 2 byte để thể hiện điều đó. 256 = 00000001 00000000
Như bạn đã biết, 255d (thập phân) bằng 11111111b (nhị phân). Nếu bây giờ bạn muốn thêm 1 vào giá trị, có hai khả năng:
Hoặc bạn chỉ có 8 bit. Trong trường hợp này, một cái gọi là tràn xảy ra. Vì vậy, "bên trong", 1 sẽ được thêm vào dẫn đến 100000000b (256d trong 9 bit). Nhưng vì bạn chỉ có sẵn 8 bit, 8 bit thấp hơn sẽ được "trả lại". Vì vậy, bạn kết thúc với 0d = 0b (một cờ tràn đặc biệt sẽ được đặt trên hầu hết các kiến trúc máy tính, giống như một ghi chú bên cạnh.)
Hãy nghĩ về điều này giống như đếm bằng ngón tay của bạn. Hãy tưởng tượng ngón tay của bạn hiển thị 9d. Bây giờ bạn thêm một ngón tay nữa. Bạn kết thúc với 10. Bạn sẽ làm gì nếu bạn muốn thêm một lần nữa?
Khả năng khác là bạn có sẵn hơn 8 bit. Trong trường hợp này, bạn chỉ cần thêm một chữ số vào đầu và kết quả sẽ thực sự là 100000000b = 256d.
Một byte là "đơn vị" nhỏ nhất mà hệ thống máy tính (hệ thống bộ nhớ) có thể xử lý. Điều này có nghĩa là nếu bạn chỉ muốn biết một bit duy nhất, bạn phải yêu cầu hệ thống bộ nhớ cung cấp cho bạn một byte nhất định từ một địa chỉ và sau đó bạn phải tìm ra giá trị của bit mà bạn quan tâm.
Nhưng giống như 8 bit tạo nên một byte, cũng có các kiểu dữ liệu lớn hơn. 2 byte tạo thành một từ (16 bit), hai từ (bốn byte, 32 bit) tạo thành một từ kép. Và các kiến trúc 64 bit tiêu chuẩn hiện nay thậm chí còn có các kiểu dữ liệu 64 bit (được gọi là các thanh ghi).
Nó là 100000000 và nó cần nhiều hơn một byte. Thật ra nó cần 9 bit.
Bạn có thể đại diện cho nó bằng một chút thay đổi hoạt động (trái hoặc phải tùy thuộc vào endianness đại diện nhị phân). Ví dụ, một lớp lót này hoạt động cho một đại diện endian lớn (đầu tiên là byte quan trọng nhất):
1 << 8
Một byte không dấu chỉ có thể chứa 256 giá trị bao gồm phạm vi [0 - 255]. Đối với giá trị 256, bạn sẽ cần sử dụng loại dữ liệu có thể chứa giá trị lớn hơn, ví dụ như một số nguyên.