Nhờ giải thích giúp đoạn code liên quan đến kiểu char và unsigned char

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

Đâ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.

5 Likes

hoang mang…:frowning:

Vẫn hoang mang thì bạn nên hiểu về:

  1. Số nhị phân - Binary, 1 byte = 8 bit. Đối với C/C++, kiểu char cũng là byte.
  2. Biểu diễn số âm bằng phương pháp bù. https://vi.wikipedia.org/wiki/Biểu_diễn_số_âm
4 Likes

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.

2 Likes

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 :grinning:

1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?