Các kiểu dữ liệu cơ bản trong C
Ở bài viết trước, chúng ta đã biết cách biến lưu trữ giá trị trong máy tính và cú pháp để khai báo biến, trong bài viết này chúng ta sẽ thảo luạn về các kiểu dữ liệu trong ngôn ngữ C, nhắc lại kiến thức của bài học trước, chung ta hiểu khi khai báo kiểu dữ liệu cho biến để lưu trữ, máy tính sẽ tự động cấp phát cho chúng ta một vị trí vùng nhớ (memory address) cùng một kích thước xác định (memory size) vừa đủ để lưu trữ kiểu dữ liệu chúng ta mong muốn. Và vì ngôn ngữ lập trình C yêu cầu cú pháp chặt chẽ, nên bạn không thể gán giá trị kiểu dữ liệu này cho một biến có kiểu dữ liệu khác, một khi khai báo kiểu dữ liệu gì cho biến thì chỉ được phép gán giá trị kiểu dữ liệu đó cho biến.
Mục lục
Từ khóa (keywords) trong khai báo biến C
Nếu chưa hiểu khái niệm về từ khóa, bạn có thể đọc lại bài viết Cấu trúc chương trình C, danh sách từ khóa (keywords) trong ngôn ngữ C để hiểu lại khái niệm. Ở đây, chúng ta nói qua về các từ khóa để xác định kiểu dữ liệu cho biến khi khai báo biến. Khi khai báo biến, cần đảm bảo tên biến không được phép trùng từ khóa (trong tên biến có thể chứa từ khóa nhưng không được phép giống hệt, ví dụ:
int int; // lỗi
int intNum; // không lỗi
Danh sách các kiểu dữ liệu cơ bản trong C
Các loại dữ liệu được lưu trữ trong biến thông thường bao gồm:
- Dữ liệu kiểu số
- Số nguyên. Ví dụ (6 hoặc -5)
- Số thực. Ví dụ (5.20 hoặc 7.234)
- Các số dương
- Các số âm
- Dữ liệu kiểu văn bản ( ví dụ “abcde” , “toi la toan”)
- Dữ liệu luận lý (true/false)
Khi dữ liệu được lưu trữ trong các biến dữ có kiểu liệu khác nhau, chúng yêu cầu dung lượng lượng bộ nhớ khác nhau. Dung lượng bộ nhớ chỉ định cho biến tùy thuộc vào kiểu dữ liệu của biến đó (với các ngôn ngữ lập trình khác cũng tương tự ). Cú pháp trong C khi sử dụng kiểu dữ liệu:
data_type variable_name //kiểudữliệu tên_biến
data_type function_name(){
// do something here
// kiểudữliệu tên_hàm
}
Trong ngôn ngữ C, có 5 kiểu dữ liệu cơ bản:
int – kiểu dữ liệu số nguyên, sử dụng để biểu diễn các số nguyên trong tự nhiên (viết tắt interger), chiếm 2 bytes vùng nhớ. (Ví dụ 5 hoặc 100 hoặc 10000)
float, double – kiểu dữ liệu số thực, biểu diễn các đại lượng số thập phân như trong toán học, kiểu float chiếm 4 bytes và biểu diễn được 6 số đằng sau số thập phân ( ví dụ 5.999999), còn kiểu double chiếm 8 bytes vùng nhớ, biểu diễn được 10 số đằng sau số thập phân
char – kiểu dữ liệu ký tự, chiếm 1 bytes vùng nhớ biểu diễn các ký tự đơn ( ‘A’,’a’,’B’,’1′,’2′ …). Lưu ý ký tự ‘1’ khác số nguyên 1
void – kiểu dữ liệu sử dụng cho khai báo hàm ( không sử dụng cho khai báo biến), sử dụng để khai báo hàm không trả về giá trị. Sẽ được đề cập ở bài khái niệm về hàm.
Kiểu dữ liệu dẫn xuất
Một bổ từ (modifier) sử dụng để kết hợp với các kiểu dữ liệu số cơ bản nhằm đáp ứng các tính huống khác nhau ( giảm kích thước bộ nhớ, tăng kích thước bộ nhớ, tăng khả năng biểu diễn cho biến ), giúp cho chương trình tối ưu hơn, tiết kiệm bộ nhớ hệ thống, hay biểu diễn các con số lớn hơn khả năng các biến có kiểu dữ liệu thông thường biểu diễn được. ( Sẽ nói ở ví dụ dưới)
sign – kiểu dữ liệu có dấu
unsign – kiểu dữ liệu không dấu
long – cấp phát gấp đôi kích thước vùng nhớ của kiểu dữ liệu
short – cấp phát một nửa kích thước vùng nhớ của kiểu dữ liệu
Cú pháp khai báo:
sign int a; // khai báo biến integer a có dấu
unsign int b; // khai báo biến interer b không dấu
short float c; // khai báo biến float nhưng cấp phát 1 nửa kích thước vùng nhớ => 2 bytes
unsign long double d; // khai báo biến double nhưng cấp phát gấp đôi kích thước vùng nhớ => 16 bytes và biểu diễn số thực không dấu
Vậy tại sao mỗi kiểu dữ liệu lại chiếm dung lượng vùng nhớ khác nhau, để hiểu rõ hơn vấn đề này, chúng ta hiểu nôm na như sau, về mặt máy tính, máy tính được thiết kế từ các linh kiện điện tử, bao gồm các bảng mạch và sử dụng dòng điện để truyền tải dữ liệu, và nó chỉ hiểu được các giá trị 0,1 tương đương với việc bật tắt dòng điện trong thiết bị điện tử. Vì vậy, để biểu diễn bất kì kiểu dữ liệu nào, máy tính cuối cùng cũng chuyển đổi nó về dạng nhị phân. Vì vậy, mọi con số, mọi ký tự hay các chuỗi kí tự khi đưa về ngôn ngữ máy để thực thi nó cũng sẽ chuyển đổi về giá trị 0 và 1. Nếu muốn tìm hiểu kỹ hơn cách biểu diễn, hãy đọc thêm bài viết Biểu diễn số nguyên dưới dạng nhị phân và các phép toán hệ nhị phân nhé.
Ví dụ: số 31 khi biểu diễn dưới dạng nhị phân sẽ là 11111, với kiểu dữ liệu int, nó sẽ được cấp phát 2 bytes, tương đương 16 bits và lưu trữ dãy số sau dưới bộ nhớ Ram: 0000000000011111 ( số 0 đầu tiên biểu diễn dấu lượng để xác định số nguyên dương hay âm)
(000011111)₂ = (0 × 2⁸) + (0 × 2⁷) + (0 × 2⁶) + (0 × 2⁵) + (1 × 2⁴) + (1 × 2³) + (1 × 2²) + (1 × 2¹) + (1 × 2⁰) = (31)₁₀
Như vậy, với kiểu int thông thường, nó chỉ có thể biểu diễn số lớn nhất là 32767 (0111111111111111) , và nhỏ nhất là -32767( 0111111111111111)
Còn với ký tự (char), nó sẽ được cấp phát 1 byte tương đương 8bits, là bộ ký tự trong bảng mã ASCII ( Chuẩn mã trao đổi thông tin Hoa Kỳ ), mỗi ký tự này hoàn toàn có thể biểu diễn theo dạng số và chúng ta có thể so khới trực tiếp trong bảng mã. Ví dụ: với ký tự ‘A’, mã ascii hệ thập phân là 65 , lưu trữ dãy số sau dưới bộ nhớ RAM: 01000001.
Tương tự với kiểu float và double, tuy nhiên 2 kiểu dữ liệu này cách biểu diễn khá phức tạp nên mình không đề cập ở đây, và chúng ta thấy, với kiểu dữ liệu càng phức tạp, bộ nhớ càng cần nhiều vùng nhớ để lưu trữ nó.
Bảng trình ví dụ mô tả vi dữ liệu biến
Kiểu dữ liệu | Kích thước vùng nhớ (đơn vị bit) | Phạm vi biểu diễn |
---|---|---|
char | 8 | -128 -> 127 ( mã ASCII) |
unsigned | 8 | 0 -> 255 |
signed char | 8 | -128 -> 127 ( mã ASCII) |
int | 16 | -32.678 -> 32.767 |
unsigned int | 16 | 0 -> 65.535 |
signed int | 16 | -32.678 -> 32.767 |
short int | 8 | -128 -> 127 |
long int | 32 | -2.147.483.648 -> 2.147.483.647 |
Ví dụ khai báo biến cơ bản:
/* khai bao thu vien chuan */
#include<stdio.h>
#include<stdlib.>
/* end khai bao thu vien chuan */
int main() {
// khai bao bien so nguyen
int songuyen;
// gan gia tri cho so nguyen bang 5
songuyen = 5;
// khai bao va gan luon gia tri cho so nguyen
int songuyencach2 = 6;
// khai bao bien c la ki tu va gan bang ky tu 'A';
char c = 'A';
// khai bao bien so thuc va gan gia tri bang 5.1
float sothuc = 5.1;
}
Giới thiệu hàm sizeof()
Hàm sizeof là hàm có sẵn (builtin) của ngôn ngữ lập trình c, sử dụng để đo lường kích thước kiểu dữ liệu, giá trị trả về của hàm sẽ là một số nguyên, thể hiện kích thước kiểu dữ liệu mà chúng ta kiểm tra.
Cú pháp hàm sizeof:
#include stdio.h
#include stdlib.h
int main(){
int a;
a = sizeof(int);
printf("%d",a);
return 0;
}
// kết quả in ra trả về 2 với hệ 16 bit, 4 với hệ 32 và 64bit
Giới thiệu hàm printf()
Hàm printf là một hàm trong input output system của ngôn ngữ C, đây là một hàm kinh điển, hay sử dụng để in dữ liệu từ biến ra màn hình thông qua các bộ định dạng (format specifier). Chúng ta sẽ nói sâu hơn ở bài Thao tác Input / Output trong C. Ở bài viết này mình sẽ ví dụ về cách sử dụng hàm printf cơ bản cùng các bộ định dạng để mọi người hiểu qua vấn đề.
Cú pháp hàm printf():
printf("%d",a); // in biến a dưới dạng só nguyên (decimal)
printf("%f",b) // in biến dưới dạng số thực (float)
printf("%c",c) // in biến dưới dạng ký tự (character)
Ví dụ kết hợp giữa việc khai báo biến và hàm printf() để in kết quả biến ra màn hình
#include<stdio.h>
#include<stdio.h>
int main() {
// khai bao bien so nguyen
int songuyen;
// gan gia tri cho so nguyen bang 5
songuyen = 5;
// khai bao va gan luon gia tri cho so nguyen
int songuyencach2 = 6;
// khai bao bien kytu la ki tu va gan bang ky tu 'A';
char kytu = 'A';
// khai bao bien so thuc va gan gia tri bang 5.1
float sothuc = 5.1;
printf("%d,%d,%c,%f",songuyen,songuyencach2,kytu,sothuc);
}
1 Comments