Kiểu dữ liệu trong C | Laptrinhcanban.com

Kiểu dữ liệu trong C

Cùng tìm hiểu về kiểu dữ liệu trong C. Bạn sẽ biết kiểu dữ liệu trong C là gì, các kiểu dữ liệu trong C, cách kiểm tra kích thước size của kiểu dữ liệu, cũng như bốn kiểu dữ liệu phổ biến nhất trong C là char, int, float và double. Ngoài ra bạn cũng sẽ học được cách sử dụng kiểu dữ liệu có dấu và không có dấu trong C (signed và unsigned) trong C sau bài học này.

Kiểu dữ liệu trong C là gì

Trong các bài Biến trong C là gì chúng ta đã biết biến trong C là một thẻ địa chỉ đại diện cho một vùng trong bộ nhớ máy tính được sử dụng để lưu dữ liệu trong xử lý chương trình. Trong máy tính có nhiều loại dữ liệu khác nhau với độ lớn nhỏ khác nhau, do đó đối với mỗi loại dữ liệu chúng ta cũng cần phải chỉ định vùng chứa nó có độ dài hợp lý, tránh việc diện tích vùng quá nhỏ không thể chứa hết dữ liệu, hoặc là vùng chứa dữ liệu lại quá to gây lãng phí tài nguyên chương trình.

Do vậy trong chương trình C, việc chỉ định loại dữ liệu nào sẽ được sử dụng trong biến vô cùng quan trọng, và loại dữ liệu nào được sử dụng trong biến được quyết định bằng kiểu dữ liệu sử dụng trong biến hay còn gọi là kiểu dữ liệu trong C.

Nói một cách đơn giản thì kiểu dữ liệu trong C là tên gọi đại diện của dữ liệu trong chương trình, từ kiểu dữ liệu chúng ta sẽ biết được loại dữ liệu đang được sử dụng là gì cũng như các đặc tính của loại dữ liệu đó. Ví dụ như kiểu int sẽ cho chúng ta biết dữ liệu thuộc loại số, độ rộng bit là 4 byte, và có dãy giá trị nằm từ 2147483648 tới 2147483647 chẳng hạn.

Có một liên tưởng rất hay đó là kiểu dữ liệu trong C cũng giống như là kiểu Pokemon vậy, ai đã xem loạt anime về Pokemon sẽ biết nhân vật Satoshi có một chiếc máy chứa thông tin về tất cả các loại Pokemon trên thế giới. Giống như mỗi Pokemon sẽ thuộc về một kiểu Pokemon riêng, với tên gọi, chủng loại, đặc tính, ưu nhược riêng, thì mỗi dữ liệu trong C cũng sẽ thuộc về một kiểu dữ liệu riêng, với tên gọi , độ lớn và phạm vi giá trị của riêng dữ liệu đó vậy.

Kiểu dữ liệu trong C được sử dụng trong khai báo và khởi tạo biến, và có tác dụng thông báo cho chương trình biết và chuẩn bị vùng chứa dữ liệu phù hợp trong bộ nhớ máy tính để có thể lưu được nó. Bạn có thể tham khảo cách sử dụng chi tiết của chúng trong khởi tạo và khai báo biến như sau:

Các kiểu dữ liệu trong C

Có 3 loại dữ liệu tương ứng với 7 kiểu dữ liệu phổ biến trong C như sau:

LoạiKiểu dữ liệuKích thướcPhạm vi giá trị
Loại ký tựchar1 byte-127 ~ 128
Số nguyênshort int
int
long int
2 byte
4 byte
4 byte
-32768 ~ 32767
-2147483648 ~ 2147483647
-2147483648 ~ 2147483647
Số thực dấu phẩy độngfloat
double
long double
4 byte
8 byte
8 byte
3.4E-38 ~ 3.4E+38
1.7E-308 ~ 1.7E+308
1.7E-308 ~ 1.7E+308

Giống như ở bảng trên thì mỗi kiểu dữ liệu trong C đều được chỉ định một kích thước riêng, và tương ứng với kích thước đó thì khả năng lưu trữ giá trị cũng sẽ được thiết lập. Ví dụ như kiểu char ở trên có kích thước nhỏ nhất (1 byte) và chỉ chứa được các giá trị trong phạm vi từ -127 đến 128 chẳng hạn.

Lưu ý rằng trong C do không có quy tắc rõ ràng về kích thước của một kiểu giá trị, và có thể khác nhau tùy thuộc vào môi trường phát triển, do đó các thông tin về kích thước của kiểu dữ liệu ở trên chỉ mang tính tham khảo.

Lại nữa, mặc dù có nhiều kiểu dữ liệu trong C như trong bảng trên, nhưng chỉ có 4 kiểu dữ liệu mà chúng ta hay dùng nhất đó chính là char, int, float và double mà thôi. Thông thường khi cần lưu dữ liệu ký tự thì chúng ta sử dụng kiểu char, số nguyên thì dùng kiểu int, và số thực thì sẽ dùng kiểu float. Tuy nhiên trong các phép tính toán khoa học cần độ chính xác cao thì hay dùng kiểu double.

Kiểm tra kích thước (size) của kiểu dữ liệu trong C

Sau đây Kiyoshi sẽ hướng dẫn bạn cách kiểm tra kích thước (size) của dữ liệu trong C. Lưu ý là do trong C do không có quy tắc rõ ràng về kích thước của một kiểu giá trị, và có thể khác nhau tùy thuộc vào môi trường phát triển, nên giá trị của phép tìm này có thể khác đi trong môi trường phát triển C của bạn.

Để kiểm tra kích thước (size) của kiểu dữ liệu trong C, chúng ta sử dụng tới hàm sizeof() với cú pháp sau đây:

sizeof(type);

Trong đó type là tên của kiểu dữ liệu cần kiểm tra, ví dụ như là int, short int, double hay long double chẳng hạn. Chúng ta sẽ sử dụng mã lệnh sau để tiến hành kiểm tra kích thức của kiểu dữ liệu trong C như sau:

#include <stdio.h>

int main(void){
printf("char : %d\n", sizeof(char));
printf("short int : %d\n", sizeof(short int));
printf("int : %d\n", sizeof(int));
printf("long int : %d\n", sizeof(long int));
printf("float : %d\n", sizeof(float));
printf("double : %d\n", sizeof(double));
printf("long double : %d\n", sizeof(long double));

return 0;
}

Kết quả kiểm tra kích thước size của kiểu dữ liệu trong môi trường phát triển C của Kiyoshi sẽ là:

char : 1
short int : 2
int : 4
long int : 8
float : 4
double : 8
long double : 16

Bạn cũng hãy thử xem kết quả trong môi trường phát triển C của bạn có giống Kiyoshi hay không nhé.

Bốn kiểu dữ liệu phổ biến nhất trong C

Kiểu char trong c

Kiểu char, hay còn gọi là kiểu ký tự trong C, được sử dụng để thao tác với các ký tự trong chương trình C. Chúng ta khởi tạo một biến thuộc kiểu char trong C với cú pháp sau đây:

char name = 'value';

Ví dụ cụ thể:

char char1 = 'a'; //Gán ký tự chữ 'a' vào biến chart1
char char2 = '?'; //Gán ký tự dấu '?'' vào biến chart2
char char3 = '8'; //Gán ký tự chữ số '8' vào biến chart3

Chúng ta sử dụng cặp dấu nháy đơn '' để biểu diễn giá trị của ký tự được gán vào biến thuộc kiểu char. Các bạn có thể tìm hiểu kỹ hơn về ký tự là gì, cũng như cách sử dụng và in kiểu ký tự ra màn hình tại bài viết sau:

Lưu ý là chúng ta chỉ sử dụng kiểu char với một ký tự. Trong trường hợp cần lưu một chuỗi ký tự thì thay vì kiểu char thông thường thì chúng ta cần sử dụng kiểu chuỗi ký tự với cách miêu tả và cú pháp khai báo khác như sau:

char name[size] = "value";

Trong đó size là độ dài của chuỗi ký tự có giá trị value cần gán, và đối số này có thể được lược bỏ.

Ví dụ cụ thể:

char str1[3] = "abc"; //Gán chuỗi ký tự "abc" vào biến chart1 có size bằng 3 
char str2[] = "abc"; //Gán chuỗi ký tự "abc" vào biến chart2 có size tự động

Bạn cũng có thể tham khảo thêm về chuỗi ký tự tại bài viết sau:

Kiểu int trong c

Kiểu int, hay còn gọi là kiểu số nguyên trong C, được sử dụng để thao tác với các số nguyên trong chương trình C. Chúng ta khởi tạo một biến thuộc kiểu int trong C với cú pháp sau đây:

int name = value;

Ví dụ cụ thể:

int num1 = 1;  //Gán số 1 vào biến num1
int num2 = 22; //Gán số 22 vào biến num1
int num3 = 88; //Gán số 88 vào biến num1

Kiểu int có kích thước dữ liệu là 4 byte, và cho phép chúng ta lưu giá trị trong khoảng từ -2147483648 đến 2147483647.

Khi chú ý đến phạm vi của số, chúng ta có thể thấy kiểu int nằm trong phạm vi của cả kiểu floatkiểu double nên sẽ có bạn tự hỏi tạo sao lại cần đến kiểu int, kiểu int có cần thiết không trong khi đã có 2 kiểu khác chứa nó rồi? Tuy nhiên vì tính chất của chúng là khác nhau, nên dù cho chúng có bao gồm phạm vi của nhau thì chúng ta cũng cần phải sử dụng chúng phù hợp trong các trường hợp. Ví dụ đơn cử, kiểu int sẽ hiển thị chính xác giá trị của số, trong khi hai kiểu float và double chỉ có thể hiển thị giá trị ước lượng mà thôi.

Các bạn có thể tìm hiểu kỹ hơn về số là gì, cũng như cách sử dụng và in kiểu số ra màn hình tại bài viết sau:

Kiểu double trong c

Kiểu double trong C được sử dụng để thao tác với các số thực dấu phẩy động trong chương trình C. Chúng ta khởi tạo một biến thuộc kiểu double trong C với cú pháp sau đây:

double name = value;

Ví dụ cụ thể:

double num1 = 1.234;  
double num2 = 22.3463;
double num3 = 88.52432;

Kiểu double cùng với kiểu float là hai kiểu dữ liệu được sử dụng để biểu diễn số thực dấu phẩy động trong chương trình C. Tuy nhiên do kiểu double có độ chính xác cao hơn kiểu float (thể hiện qua việc số chữ số đằng sau dấu chấm là nhiều hơn so với kiểu float), nên nó thường được sử dụng nhiều hơn trong các tính toán khoa học vốn yêu cầu cao hơn về độ chính xác.

Kiểu float trong c

Kiểu float trong C được sử dụng để thao tác với các số thực dấu phẩy động trong chương trình C. Chúng ta khởi tạo một biến thuộc kiểu float trong C với cú pháp sau đây:

float name = value;

Ví dụ cụ thể:

float num1 = 1.234; 
float num2 = 22.3463;
float num3 = 88.52432;

Kiểu double cùng với kiểu float là hai kiểu dữ liệu được sử dụng để biểu diễn số thực dấu phẩy động trong chương trình C. Mặc dù phạm vi kiểu float nằm trong kiểu double và có độ chính xác kém hơn kiểu double, tuy nhiên trong các tính toán thông thường với số thực vốn không yêu cầu quá cao về độ chính xác, và hay được làm tròn số nữa, thì kiểu float lại có lợi thế hơn kiểu double, do nó nhỏ hơn nên tốn ít bộ nhớ hơn.

Kiểu dữ liệu có dấu và không có dấu trong C | signed và unsigned trong C

signed và unsigned trong C là gì

Ở phần trên chúng ta đã biết với mỗi kiểu dữ liệu trong C sẽ có một phạm vi giá trị riêng bắt đầu từ một số âm đến một số dương nào đó. Ví dụ như kiểu char có phạm vi giá trị bắt đầu từ -127 đến 128 chẳng hạn. Chúng ta gọi các dữ liệu có phạm vi giá trị chứa cả số âm và số dương như vậy là kiểu dữ liệu có dấu - kiểu dữ liệu signed trong C.

Ngược lại thì với các dữ liệu có phạm vi giá trị không chứa số âm thì được gọi là kiểu dữ liệu không dấu- kiểu dữ liệu unsigned trong C.

Về mặc định thì khi khai báo hoặc khởi tạo biến trong C, chương trình sẽ tự động định nghĩa biến thuộc kiểu kiểu dữ liệu có dấu - kiểu dữ liệu signed . Tuy nhiên cũng có những trường hợp chúng ta biết trước sẽ không sử dụng tới số âm trong chương trình, do đó nếu chúng ta khai báo kiểu dữ liệu theo cách thông thường, thì sẽ dẫn đến một phần dung lượng trong biến sẽ được khai báo mà không được sử dụng, dẫn đến sự lãng phí bộ nhớ chương trình.

Bởi vậy, để tiết kiệm và sử dụng hiệu quả dung lượng bộ nhớ chỉ định cho biến, chúng ta có thể báo cho chương trình biết trước dữ liệu mà chúng ta lưu trong biến có dấu hay không, bằng cách sử dụng tới hai từ khoá là signed và unsigned trong C. Trong đó signed nghĩa là dữ liệu có dấu, và unsigned nghĩa là dữ liệu không có dấu trong C.

Lưu ý là khi chỉ định Kiểu dữ liệu signed và unsigned trong C, chúng ta cần phải chú ý tới 2 điểm sau đây:

  1. Không thể sử dụng signed và unsigned trong C cho các kiểu dữ liệu số thực dấu phẩy động như là float hay double.

  2. Việc chỉ định signed và unsigned sẽ không làm thay đổi kích thước (size) của dữ liệu, mà chỉ thay đổi phạm vi dữ liệu có thể gán trong nó mà thôi.

Cụ thể thì chúng ta có bảng so sánh các kiểu dữ liệu trong C trong trường hợp mặc định (signed) và unsigned như sau:

Bảng So sánh Kiểu dữ liệu mặc định (signed) và unsigned trong C

LoạiKiểu dữ liệuKích thướcPhạm vi giá trị mặc đinh (signed)Phạm vi giá trị (unsigned)
Loại ký tựchar1 byte-127 ~ 1280 ~ 255
Số nguyênshort int
int
long int
2 byte
4 byte
4 byte
-32768 ~ 32767
-2147483648 ~ 2147483647
-2147483648 ~ 2147483647
0 ~ 65535
0 ~ 4294967295
0 ~ 4294967295

Cách khai báo kiểu dữ liệu signed và unsigned trong C

Để khởi tạo và khai báo kiểu dữ liệu có dấu signed trong C, theo cách chính xác thì chúng ta cần phải thêm từ khoá signed vào trước tên biến khi khai báo hoặc khởi tạo nó. Ví dụ:

signed char char1 = 'a'; 
signed char str[] = "abc";
signed int num1 = 22;

Tuy nhiên thì do chúng ta có thể lược bỏ từ khoá này và sử dụng kiểu dữ liệu theo cách mặc định, giống như Kiyoshi đã hướng dẫn ở phần trên.

char char1 = 'a'; 
char str[] = "abc";
int num1 = 22;

Khác với kiểu dữ liệu có dấu thì để sử dụng kiểu dữ liệu không dấu unsigned trong C thì chúng ta bắt buộc phải thêm từ khoá unsigned vào đằng trước khi khởi tạo và khai báo biến. Ví dụ:

unsigned char char1 = 'a'; 
unsigned char str[] = "abc";
unsigned int num1 = 22;

Sự khác biệt giữa kiểu dữ liệu signed và unsigned trong C

Hai kiểu dữ liệu signed và unsigned trong C có điểm khác biệt duy nhất đó chính là phạm vi giá trị có thể sử dụng được trong nó.

Lấy ví dụ như kiểu char chẳng hạn. Với mặc định thông thường thì chúng ta chỉ có thể gán các giá trị trong phạm vi từ -127 đến 128, tuy nhiên nếu chuyển sang kiểu unsigned trong C thì chúng ta lại có thể gán các giá trị trong phạm vi từ 0 đến 255.

Hãy kiểm chứng bằng chương trình sau đây:

#include <stdio.h>

int main(void){
char var1 = 200;
unsigned char var2 = 200;

printf("kiểu dữ liệu signed\t= %d\n",var1);
//> kiểu dữ liệu signed = -56
printf("kiểu dữ liệu unsigned\t= %d",var2);
//> kiểu dữ liệu unsigned = 200
}

Bạn có thể thấy rõ ràng rằng với mặc định thông thường (signed) thì biến var1 không thể chứa giá trị 200 mà trả về một giá trị không phải do chúng ta chỉ định, trong khi kiểu dữ liệu unsigned lại có thể chứa được giá trị 200 và in nó ra chính xác ở màn hình kết quả.

Chú ý không sử dụng signed và unsigned với float hay double trong C

Với các kiểu dữ liệu dùng để biểu diễn số thực dấu phẩy động trong C như là kiểu float hay double chẳng hạn, chúng ta lưu ý rằng không thể sử dụng signed và unsigned với chúng được. Ví dụ các cách viết sau đây sẽ đều dẫn đến lỗi compile chương trình:

signed float num1 = 1.234; 
signed double num2 = 1.234;

unsigned float num3 = 1.234;
unsigned double num4 = 1.234;

>>>Main.c:4:2: error: 'float' cannot be signed or unsigned
signed float num1 = 1.234;
^
>>>Main.c:5:2: error: 'double' cannot be signed or unsigned
unsigned double num3 = 1.234;
^

Tổng kết

Trên đây Kiyoshi đã giải thích chi tiết về kiểu dữ liệu trong C rồi. Để nắm rõ nội dung bài học hơn, bạn hãy thực hành viết lại các ví dụ của ngày hôm nay nhé.

Và hãy cùng tìm hiểu những kiến thức sâu hơn về C trong các bài học tiếp theo.

HOME>> >>

Profile
きよしです!笑

Tác giả : Kiyoshi (Chis Thanh)

Kiyoshi là một cựu du học sinh tại Nhật Bản. Sau khi tốt nghiệp đại học Toyama năm 2017, Kiyoshi hiện đang làm BrSE tại Tokyo, Nhật Bản.