Có một cái ví dụ trong sách này mà mình đọc vào nhưng chưa hiểu lắm,mong các tiền bối giải thích giúp
Nhờ giải thích giúp đoạn code liên quan đến kiểu char và unsigned char
Đây là cách máy tính lưu trữ dữ liệu cho 2 kiểu có dấu và không dấu(số dương và số 0)
- có dấu: bit đầu tiên là dấu (0 là số dương, 1 là số âm), 7 bit sau là số (từ 0b0000000 -> 0bFFFFFFFF = 0 -> 127). Tại sao có số -128.
- không dấu: 8 bit đều mã hoá thành số. (0b00000000 -> 0bFFFFFFFF = 0 ->125)
Tại sao có số -128
Giả sử 1 số có dấu của bạn là 0b1 0000000. theo lý thuyết có thể mã hoá là -0 hay = 0
- 0b1 0000001. theo lý thuyết có thể mã hoá là -1. Cho tiện và dễ mã hoá.
Nhưng thực tế, người ta mã hoá bằng phần bù.
- 0b1 0000000 = 0 - 128
- 0b1 0000001 = 1 - 128 = -127
… - 0b1 FFFFFFF = 127 - 128 = -1
Trong cái VD của bạn:
ch2 + 56 = 256
là sai. vì kiểu unsigned char chỉ có 8 bits. Khi cộng tới 256 nó bị tràn và kết quả thu được vẫn là số 0 mà thôi.
hoang mang…
Vẫn hoang mang thì bạn nên hiểu về:
- Số nhị phân - Binary, 1 byte = 8 bit. Đối với C/C++, kiểu
char
cũng làbyte
. - Biểu diễn số âm bằng phương pháp bù. https://vi.wikipedia.org/wiki/Biểu_diễn_số_âm
lúc in ra nó hiển thị -56 chứ ko phải số 0 như b nói ạ
Bạn xem lại phần Phạm vi biểu diễn trong bảng ở câu hỏi của bạn.
Khi bạn in ra nó tự ép về kiểu int
(4 byte) chứ không phải char
(1 byte). Dùng phép toán bit để lấy 1 byte là ra 0 thôi.
Dạ e hiểu rồi,cơ chế là khi cho giá trị 200 khi đang signed char thì nó sẽ bị quá giới hạn,nó sẽ quay lại 0 nhưng khi hiển thị thì nó đã dùng cơ chế bù trừ để hiển thị -56,Amazing