Cho em hỏi là: Số 1 và số -255 khi biểu diễn dưới dạng nhị phân đều là 0000 0001
, thì làm sao để biết khi nào là số -255 và khi nào là số 1
Làm sao để biết hệ nhị phân biểu diễn số nào
Không bao giờ biết nhé.
Không biết bạn tính như thế nào mà ra được -255 có mã nhị phân giống 1
Ngay cả số lượng bit cũng đã thấy sai rồi. -255 và 1 phải dùng ít nhất 9 bit để lưu (hoặc tròn 2 bytes).
8 bit không lưu đủ.
Bạn cho ví dụ sai nhưng hi vọng chắc là do bạn nhầm gì thôi.
Biết thì không thể biết được, chỉ có viết code ra cho tưong ứng với dữ liệu mà thôi.
(Các ngôn ngữ như C#, Java, v.v. thì “biết được”, do hệ thống vận hành nó lưu cả metadata đi kèm cho mọi thứ (reflection), bản chất giống như lưu kèm thêm thông tin đi kèm để sau này đọc vào là biết âm hay dương, chuẩn C++ đã đưa vào hệ thống kiểu này để làm pattern matching nhưng chắc phải chờ thêm vài năm để đưa vào đại trà).
Bạn cứ nhớ cho mình một hệ thống logic hình thức thì không thể tự suy lý lên chính bản thân nó nha (định luật bất toàn), computer ngày nay là một hệ thống như vậy.
biểu diễn số 1 theo kiểu dữ liệu:
byte: 0 001
short: 0 000 0001
int: 0 000 0000 0000 0001
long: 0 000 0000 0000 0000 0000 0000 0000 0001 (chữ số đầu tiên biểu diễn dấu)
ushort: 0000 0001
uint: 0000 0000 0000 0001
Dữ liệu được lưu dưới dạng dãy bit, tuỳ xem khi gọi ra, bạn ép kiểu dữ liệu nó như thế nào thì nó sẽ ra như thế, chẳng hạn (uint) -1 = 254
Như đã nói ở trên thì mã hóa được cả 2 số -255 và 1 cần phải dùng ít nhất 9 bit.
Mình thấy có một số ngôn ngữ họ dùng cách sau để mã hóa số âm.
Trước hết chia số ra làm 2 phần: phần đầu là số bit dùng mã hóa dấu, phần sau là mã hóa trị tuyệt đối của số.
1 = 0 00000001
-1 = 1 11111111
-255 = 1 00000001
Về các bit mã hóa dấu:
- Nếu là số dương thì tất cả các bit dư đầu tiên sẽ là 0
- Nếu là số âm thì tất cả các bit đầu tiên là 1
Về các bit lưu số:
- Số dương: mã nhị phân của chính số đó
- Số âm: mã nhị phân của 256 - số
Nếu dùng tròn biến 2 bytes thì:
1 = 00000000 00000001
-1 = 11111111 11111111
-255 = 11111111 00000001