Bài 6. Kiểu dữ liệu trong C và kiến trúc bộ nhớ
Bài viết “[Lập trình C từ 0 đến 1] Bài 6. Kiểu dữ liệu trong C và kiến trúc bộ nhớ” là bài viết tiếp theo nằm trong series hướng dẫn học lập trình C của tek4.vn.
Độc giả có thể tham khảo các bài viết khác trong series bài viết này tại đây
Bài viết này sẽ cung cấp đến độc giả những kiểu dữ liệu trong C và một vài cách biểu diễn dữ liệu trong máy tính. Trong loạt bài hướng dẫn [Lập trình C từ 0 đến 1], IDE được sử dụng là Code::Blocks
Bài đọc này sẽ giới thiệu khái quát về các kiểu dữ liệu trong C. Nhưng trước khi tìm hiểu về các kiểu dữ liệu ta sẽ tìm hiểu cách mà máy tính biểu diễn các số, các ký tự.
1.Biểu diễn các ký tự trong máy tính
Viện Chuẩn Hóa Hoa Kỳ (American National Standards Institute) đã đưa ra bộ mã chuẩn trong giao tiếp thông tin trên máy tính gọi là bộ mã ASCII (American Standard Code for Information Interchage) và đã trở thành chuẩn công nghiệp cho các nhà sản xuất máy tính. Bộ mã này dùng 7 bit để biểu diễn các ký tự, tuy vậy mỗi ký tự trong bảng mã ASCII vẫn chiếm hết một byte khi thực hiện trong bộ nhớ máy tính, bit dư ra sẽ bị bỏ qua hoặc được dùng cho biểu diễn một cho ký tự đặc biệt. Trong bảng mã ASCII sẽ bao gồm các ký tự chữ hoa, thường, ký tự số, ký tự khoảng trắng,…
Ví dụ:
dãy bit sau là biểu diễn của chuỗi ký tự “Hi tek4.vn ”
01001000 | 01101001 | 00100000 | 01110100 | 01100101 | 01101011 | 00110100 | 00101110 | 01110110 | 01101110 |
H | i | Space | t | e | k | 4 | . | v | n |
Nhìn vào biểu diễn dãy bit sau chứng mình mỗi ký tự chỉ sử dụng 7 bit vì các bit dư ( bit 0 ở đầu) đều được máy tính lượt bỏ.
Vậy ký tự trong máy tính được biểu diễn dưới dạng mã của bộ mã ASCII
2. Biểu diễn giá trị các số dương
Ta nhận thấy một byte có thể lưu trữ một số nguyên có giá trị trong khoảng từ 0 đến 255 (00000000 đến 11111111), với 2 byte có thể lưu trữ một số nguyên có giá trị từ 0 đến 65535. Cách làm này sẽ làm tăng hiệu quả khả năng lưu trữ các số nguyên so với cách dùng một byte cho một chữ số trong bảng mã ASCII.
1 byte | 0000 0000 | 1111 1111 |
2 byte | 0000 0000 0000 0000 | 1111 1111 1111 1111 |
3 byte | 0000 0000 0000 0000 0000 0000 | 1111 1111 1111 1111 1111 1111 |
4 byte | 0000 0000 0000 0000 0000 0000 0000 0000 | 1111 1111 1111 1111 1111 11111111 1111 |
4. Phương pháp biểu diễn bù 1
Theo cách biểu diễn này vẫn dùng bit cực trái làm bit dấu là 0 cho số dương và 1 cho số âm. Ðể biểu diễn số n theo dạng bù 1 ta thực hiện các thao tác sau :
Biểu diễn dưới dạng nhị phân của trị tuyệt đối n theo mẩu k bit cố định cho trước. Nếu n < 0 thì đổi 1 thành 0 và ngược lại trong dãy số nhị phân.
Ví dụ:
với n = 5 dùng mẩu 4 bit thì biểu diễn theo phương pháp bù 1 là 0101
n = -5 dùng mẩu 4 bit thì biểu diễn theo phương pháp bù 1 là 1010
với n = 6 dùng mẩu 4 bit thì biểu diễn theo phương pháp bù 1 là 0110
n = -6 dùng mẩu 4 bit thì biểu diễn theo phương pháp bù 1 là 1001
nếu biểu diễn nhị phân của 6 là | 0 | 1 | 1 | 0 |
thì biểu diễn số bù 1 của -6 sẽ là | 1 | 0 | 0 | 1 |
5. Phương pháp biểu diễn bù 2
Theo cách biểu diễn này vẫn sử dụng bit cực trái làm bit dấu giống như bù 1, nhưng có một số khác biệt khi đổi sang hệ nhị phân có dấu, các buớc thực hiện như sau :
Biểu diễn dưới dạng nhị phân của trị tuyệt đối n theo mẩu k bit cố định cho trước. Nếu n < 0 thì bắt đầu từ phải qua trái giữ nguyên các bit cho đến khi gặp bit có giá trị là 1 đầu tiên, sau đó các bit tiếp theo bên trái bit 1 đầu tiên đó đổi 1 thành 0 và ngược lại.
Ví dụ :
cho n = -6 thì biểu diễn nhị phân của trị tuyệt đối của n cho mẩu 4 bit là 0110 khi đó biểu diễn của số bù 2 cho -6 là 1010
Biểu diễn số bù 2 qua mẩu 4 bit
Mẩu bit | Số |
0110 | 6 |
1010 | -6 |
Thực chất số biểu diễn dưới dạng bù 2 là số biểu diễn ở bù 1 sau đó ta cộng thêm 1.
Ví dụ :
Số -6 có biểu diễn bù 1 là 1001 nếu ta lấy số bù 1 này cộng thêm 1 thì kết quả là 1001 + 1 = 1010 đây chính là dạng bù 2
Hình vẽ sau sẽ minh hoạ biểu diễn số bù 2 cho số -6 :
nếu biểu diễn nhị phân của 6 là | 0 | 1 | 1 | 0 | |
thì biểu diễn số bù 1 của -6 sẽ là | 1 | 0 | 0 | 1 | |
cộng thêm 1 | + | 1 | |||
thì biểu diễn số bù 2 của -6 sẽ là | = | 1 | 0 | 1 | 0 |
6. Lỗi tràn số
Ví dụ :
Ta dùng mẩu 4 bit cho biểu diễn bù 2 cho -6 và -4, khi đó bài toán được thực hiện như sau :
-6 biểu diễn ở bù 2 với mẩu 4 bit là 1010
-4 biểu diễn ở bù 2 với mẩu 4 bit là 1100
Kết quả phép cộng ở dạng bù 1 là 0110 là biểu diễn của +6, do đó kết quả bị sai.
Nguyên nhân là ta lấy số lượng bit để biểu diễn quá ít nên xảy ra lỗi tràn số. Do đó người sử dụng máy tính phải lường trước được tình huống này khi muốn lưu trữ dữ liệu, để khắc phục ta tăng số lượng bit nhiều hơn thì sẽ không gây hiện tượng tràn. Ví dụ với mẩu 32 bit thì giá trị dương lớn nhất là 2147483647.
Tổng quát ta có số ở phép biểu diễn bù 1 và bù 2 thì giá trị dương lớn nhất cho phép khi dùng mẩu n bit là : 2n-1 -1 và giá trị âm nhỏ nhất là -2n-1
7. Các kiểu dữ liệu trong C
Kiểu số nguyên
Type | Kích thước | Phạm vi giá trị |
char | 1 byte | -128 to 127 hoặc 0 to 255 |
unsigned char | 1 byte | 0 tới 255 |
signed char | 1 byte | -128 tới 127 |
int | 2 or 4 bytes | -32,768 tới 32,767 hoặc -2,147,483,648 tới 2,147,483,647 |
unsigned int | 2 or 4 bytes | 0 tới 65,535 hoặc 0 tới 4,294,967,295 |
short | 2 bytes | -32,768 tới 32,767 |
unsigned short | 2 bytes | 0 tới 65,535 |
long | 8 bytes | -9223372036854775808 tới 9223372036854775807 |
unsigned long | 8 bytes | 0 tới 18446744073709551615 |
Kiểu số thực
Type | Kích thước | Phạm vi giá trị | Độ chính xác |
float | 4 byte | 1.2E-38 to 3.4E+38 | 6 chữ số thập phân |
double | 8 byte | 2.3E-308 to 1.7E+308 | 15 chữ số thập phân |
long double | 10 byte | 3.4E-4932 to 1.1E+4932 | 19 chữ số thập phân |
Kiểu ký tự
Type | Kích thước | Phạm vi giá trị |
char or signed char | 1 byte | -128 to 127 |
unsigned char | 1 byte | 0 to 255 |
Kiểu void
Kiểu void có nghĩa là “không có giá trị”, nó không được dùng trong khai báo biến thông thường mà được sử dụng để chỉ định kiểu của các hàm không có giá trị trả về. Chúng ta sẽ hiểu rõ hơn về kiểu dữ liệu này trong tương lai ở các bài học về hàm, con trỏ,…
Chúng ta sẽ kết thúc “[Lập trình C từ 0 đến 1] Bài 6. Kiểu dữ liệu trong C và kiến trúc bộ nhớ” trong series [Lập trình C từ 0 đến 1] ở đây. Hãy cùng đón xem “Bài 7. Biến trong C và các vấn đề liên quan”.
Hãy để lại bình luận và theo dõi series bài viết: “Lập trình C từ 0 đến 1” để tiếp tục cập nhật những thông tin mới nhất.