Giải thích giúp vẫn đề về biến trong bài tập C này ạ

e cũng hóng giải thích

1 Like

thật sự là giáo sư Lê Thị Ất viết sách khó hiểu thật

Miền giá trị của kiểu dữ liệu char là từ -128 đến 127, của unsigned char là từ 0 đến 255. Khi khai báo char ch1 = 200; nó sẽ vượt quá miền dữ liệu và sẽ quay ngược lại về -56 (bạn có thể dùng máy tính để tính hoặc tính tay :smile:). Bạn nên tìm hiểu thêm trên google chẳng hạn nếu việc tìm hiểu trong sách gặp bế tắc

1 Like

Cám ơn bạn nhiều :slight_smile:

hehe, không có gì :stuck_out_tongue:

1 Like

à à cho e hỏi bác đang theo học gì vậy

tui chưa có phân chuyên ngành, vẫn đang học đại cương các kiểu thôi :stuck_out_tongue:

Bạn ơi mình vẫn chưa hiểu lắm. kiểu char biểu diễn từ -128 đến 127 nghĩa là 256 kí tự nhưng biểu diễn số 200 tại sao lại bị -56 ?. mình biết là 256-200=56 mà tại sao? bạn thông não giùm mình đi

Cách ở trên khá là ad-hoc nhưng vẫn dễ hiểu hơn.

Làm bài bản thì công thức bù 2 là -x := NOT x + 1 (vế phải là unsigned nhé) với x>0, mà NOT x = 255-x (số có 8 bit thôi) vậy -x := 256 - x với x>0.

Hay nói cách khác số -56 biểu diễn unsigned là 200. Với bù 1 thì -x := NOT x, cách này dở ở chỗ là có đến hai số 0.

1 Like

Đối với các kiểu dữ liệu không dấu (ví dụ unsigned int) thì tất cả các bit đều để biểu thị độ lớn.
200 => (0000000...00)11001000 (kiểu dữ liệu n byte thì thêm các bit 0 cho đủ n*8 bit)

Đối với các kiểu dữ liệu có dấu (ví dụ int) thì bit đầu tiên thể hiện có dấu hay không (true hay 1 tức là có dấu
-56 => (1|111111...11)1001000 ((kiểu dữ liệu n byte thì thêm các bit 1 sau bit “âm dương” cho đủ n*8 bit)

Kiểu unsigned char (1 byte) gồm 8 bit dữ liệu, biểu diễn các giá trị từ 2 ^ 0 - 1(= 0) đến 2 ^ 8 - 1 (= 255) (00000000 = 0 => 11111111 = 255)
Chuỗi bit 11001000 thể hiện giá trị 200 trong hệ đếm của con người.

Kiểu char (1 byte) gồm 1 bit dấu và 7 bit dữ liệu, biểu diễn các giá trị từ - (2 ^ 7) (= -128) đến + (2 ^ 7 - 1) (= +127). Phần âm không bị mất chuỗi bit nào để biểu diễn số 0 nên đủ 128 số (10000000 = -128 => 11111111 = -100000000 = 0 => 01111111 = 127)

Trong hệ số không dấu 1 byte, 11001000 = 200
Trong hệ số có dấu 1 byte, 1|1001000 = -56

À, bảng mã ASCII chuẩn chỉ có 128 ký tự thôi bạn :slight_smile:

3 Likes

Cám ơn vì sự nhiệt tình ạ

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