Bài 2.5. Tìm hiểu về các kiểu dữ liệu
Nội dung bài học
- Các kiểu và định dạng chuyển đổi tương ứng
- Kiểu có dấu và kiểu không dấu
- Kiểm tra kích thước của kiểu
- Cách tính giá trị min, max của một kiểu
- Hằng số
Các kiểu và định dạng chuyển đổi tương ứng
Các kiểu dữ liệu trong ngôn ngữ C gồm kiểu nguyên, kiểu thực và bool, trong đó:
- Kiểu nguyên gồm:
- char, short, int, long, long long
- unsigned short, unsigned int, unsigned long, unsigned long long
- Kiểu thực gồm:
- float
- double
- LƯU Ý: giá trị của kiểu float luôn có chữ f ở cuối
- Kiểu bool chuyên dùng để lưu giá trị true/false
Kích thước và định dạng chuyển đổi cho cụ thể trong hình sau:

Như hình đã chỉ ra, mỗi một kiểu có một định dạng chuyển đổi tương ứng. Chúng được sử dụng khi thực hiện các thao tác nhập liệu. Ví dụ như khi nhập dữ liệu vào từ bàn phím, hiển thị ra màn hình. Cũng dùng các định dạng này cho quá trình đọc ghi file.
Lưu ý rằng định dạng chuyển đổi không được dùng lộn xộn. Kiểu nào chỉ dùng của kiểu đó. Ví dụ như %d chỉ dùng cho kiểu int, %c chỉ dùng cho kiểu char.
Ý nghĩa sử dụng của các kiểu:
- Nếu muốn lưu trữ giá trị số nguyên ta dùng các kiểu nguyên như short, int, long…
- Nếu muốn lưu trữ các số cả số âm và dương ta dùng kiểu không có unsigned. Ví dụ int, float, long…
- Nếu muốn lưu các số nguyên không âm, ta dùng các kiểu nguyên bắt đầu với unsigned. Ví dụ như unsigned int.
- Nếu muốn lưu trữ các giá trị số thực ta dùng các kiểu float, double. Nếu muốn đảm bảo độ chính xác cao hơn thì dùng double.
- Nếu muốn lưu trữ 01 kí tự đơn như ‘a’, ‘*’ hay ‘5’ ta dùng kiểu char.
- Nếu muốn lưu giá trị true/false ta dùng kiểu bool.
- Lưu ý rằng, trong ngôn ngữ C quy ước: mọi giá trị số khác 0 đều là giá trị đúng. Tức là 0 tương đương false, các giá trị còn lại tương đương true.
Kiểu có dấu và kiểu không dấu
- Kiểu có dấu và không dấu chỉ áp dụng với các kiểu nguyên là: short, int, long, long long.
- Kiểu có dấu là kiểu có thể lưu trữ được cả giá trị âm và giá trị dương.
- Kiểu không dấu là kiểu mà chỉ có thể lưu trữ các giá trị >= 0
- Do đó khi gán giá trị âm cho biến kiểu không dấu, ta nhận một giá trị không phải số âm. Hết sức lưu ý điều này!
- Giá trị tối đa của kiểu có dấu chỉ bằng nửa so với kiểu không dấu.
Kiểm tra kích thước của kiểu
Để kiểm tra kích thước của kiểu, ta dùng toán tử sizeof. Kết quả nhận được là số byte. Ví dụ cụ thể trong chương trình sau:
#include <stdio.h>
int main() {
// cu phap kiem tra kich thuoc kieu:
// sizeof(type);
printf("Size of int: %u\n", sizeof(int));
printf("Size of unsigned int: %u\n", sizeof(unsigned int));
printf("Size of long: %u\n", sizeof(long));
printf("Size of long long: %u\n", sizeof(long long));
printf("Size of float: %u\n", sizeof(float));
printf("Size of double: %u\n", sizeof(double));
printf("Size of long double: %u\n", sizeof(long double));
}
Kết quả ta được như sau:
Size of int: 4
Size of unsigned int: 4
Size of long: 4
Size of long long: 8
Size of float: 4
Size of double: 8
Size of long double: 8
Lưu ý rằng mỗi hệ điều hành có thể cho ta các giá trị khác nhau của cùng kiểu. Đây là do sự thiếu nhất quán của ngôn ngữ này và không thành vấn đề. Ví dụ kiểu int có thể là 2, 4 hoặc thậm chí 8 byte ở các hệ điều hành khác nhau: Windows 32 bit, 64 bit, Linux, MAC OS…
Cách tính giá trị nhỏ nhất và lớn nhất của một kiểu
- Với kiểu có dấu:
- MAX = 2^(kích thước * 8 – 1) – 1. Ví dụ kiểu int 4byte. Giá trị max của nó là 2^31 – 1 = 2147483647
- MIN = -(MAX + 1). Ví dụ với kiểu int 4byte thì min = -2147483648
- Với kiểu không dấu:
- MAX = 2^(8 * kích thước) – 1. Ví dụ kiểu unsigned int 4byte thì max = 2^32 – 1 = 4294967295
Các kiểu nguyên khác bạn tính tương tự. Không áp dụng cách tính này cho kiểu số thực, bool.
Kiểm tra dùng thư viện:
#include <stdio.h>
#include <limits.h>
int main() {
printf("Min int value: %d\n", INT_MIN);
printf("Max int value: %d\n", INT_MAX);
printf("Min long long value: %lld\n", LLONG_MIN);
printf("Max long long value: %lld\n", LLONG_MAX);
}
Kết quả:
Min int value: -2147483648
Max int value: 2147483647
Min long long value: -9223372036854775808
Max long long value: 9223372036854775807
Với các kiểu số thực ta sử dụng thư viện float.h
#include <stdio.h>
#include <float.h>
int main() {
printf("%lf\n", DBL_MAX); // tương tự cho DBL_MIN
printf("%f\n", FLT_MAX); // ngược lại ta có FLT_MIN
}
179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000
340282346638528859811704183484516925440.000000
Hằng số
Cuối cùng nhưng không kém phần quan trọng, đó là hằng số trong ngôn ngữ C.
- Hằng số là các giá trị ta đã biết trước và không thay đổi như số PI, số E, các hằng số vật lí…
- Biến hằng số là biến mà giá trị của nó sau khi gán lần đầu tiên thì không thể thay đổi
- Tên hằng số thường VIẾT HOA và nếu nó có nhiều từ ghép lại thì chúng nối nhau bằng dấu gạch dưới.
- Có hai cách tạo ra hằng số trong C:
- Cách 1: sử dụng #define: #define tên_hằng giá_trị. Ví dụ: #define MY_NUMBER 100
- Cách 2: sử dụng keyword const: const kiểu_dữ_liệu tên_hằng = giá_trị; ví dụ const int MY_NUMBER = 200;
- Khác nhau? Cách 1 không có kiểu, = và ; Ưu điểm của cách 2 là tường minh về mặt ngữ nghĩa và kiểu cũng như cú pháp về câu lệnh của biến.
Như vậy ta đã kết thúc phần lý thuyết về kiểu dữ liệu và hằng số. Ví dụ minh họa và thực hành sẽ có trong bài kế tiếp.
