Các kiểu dữ liệu cơ bản trong C – Web888 chia sẻ kiến thức lập trình, kinh doanh, mmo

Ở 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.

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 hoàn toàn có thể đọc lại bài viết Cấu trúc chương trình C, list từ khóa ( keywords ) trong ngôn từ C để hiểu lại khái niệm. Ở đây, tất cả chúng ta nói qua về những từ khóa để xác lập kiểu tài liệu cho biến khi khai báo biến. Khi khai báo biến, cần bảo vệ tên biến không được phép trùng từ khóa ( trong tên biến hoàn toà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 tài liệu được tàng trữ trong biến thường thì gồm có :

  • 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 tài liệu lại chiếm dung tích vùng nhớ khác nhau, để hiểu rõ hơn yếu tố này, tất cả chúng ta hiểu nôm na như sau, về mặt máy tính, máy tính được phong cách thiết kế từ những linh phụ kiện điện tử, gồm có những bảng mạch và sử dụng dòng điện để truyền tải tài liệu, và nó chỉ hiểu được những giá trị 0,1 tương tự với việc bật tắt dòng điện trong thiết bị điện tử. Vì vậy, để màn biểu diễn bất kỳ kiểu tài liệu nào, máy tính sau cuối cũng quy đổi nó về dạng nhị phân. Vì vậy, mọi số lượng, mọi ký tự hay những chuỗi kí tự khi đưa về ngôn ngữ máy để thực thi nó cũng sẽ quy đổi về giá trị 0 và 1. Nếu muốn khám phá kỹ hơn cách màn 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à những phép toán hệ nhị phân nhé .
mô tả quy trình biên dịch các ngôn ngữ lập trì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ì, nó chỉ hoàn toàn có thể trình 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 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ụ diễn đạ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
#include
/* 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 từ lập trình c, sử dụng để thống kê giám sát kích cỡ kiểu tài liệu, giá trị trả về của hàm sẽ là một số nguyên, biểu lộ size kiểu tài liệu mà tất cả 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 input,output. Ở 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

#include

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);
}