C – Ngôn ngữ lập trình phổ biến được sử dụng rất nhiều trong quá trình phát triển ứng dụng phần mềm. Được sử dụng để xác định hàm hoặc biến trong C, mỗi biến sẽ tương ứng với 1 kiểu dữ liệu khác nhau. Vậy đâu là các kiểu dữ liệu trong C phổ biến nhất? Phạm vi, kích thước của nó ra sao? Hãy cùng tìm hiểu với Testerpro trong bài viết dưới đây nhé!
Các kiểu dữ liệu cơ bản trong C
Integers – Dữ liệu kiểu số nguyên
Integers – kiểu dữ liệu trong C dạng số nguyên, chúng chỉ được sử dụng để lưu trữ giá trị số nguyên không chứa các số thập phân. Đặc biệt các giá trị như giá trị thập phân, Octal values and hexadecimal values sẽ không thể xuất hiện trong kiểu dữ liệu này.
Bên cạnh đó, bạn có thể tự tính kích thước của kiểu dữ liệu trong C này thông qua việc sử dụng sizeof operator trong C. Hơn nữa, các giá trị số nguyên (int) được lưu trữ trong C bao gồm các giá trị nguyên dương từ 0 và không chưa các giá trị số âm như signed int.
Thông thường các unsigned int sẽ có kích thước lớn hơn so với signed int và mã định dạng sẽ sử dụng theo công thức %u. Để có thể triển khai công việc lập trình theo kiểu số nguyên thì bạn có thể dựa vào các thông tin cơ bản sau:
- Phạm vi: -2,147,483,648 đến 2,147,483,647
- Kích thước tối đa: 2 byte hoặc 4 byte
- Định dạng theo kiểu: %d
Lưu ý: Phần kích thước của dữ liệu số nguyên sẽ phụ thuộc hoàn toàn vào quá trình biên dịch và xử lý dữ liệu. Ví dụ: quá trình xử lý hệ thống là 16 bit thì kết quả đầu ra tương ứng sẽ hiển thị là 2 byte còn khi hệ thống xử lý dữ liệu 32 bit thì khi này kết quả sẽ hiển thị 4 byte.
Ví dụ:
// C program to print Integer data types.
#include <stdio.h>
int
main()
{
// Integer value with positive data.
int
a = 9;
// integer value with negative data.
int
b = -9;
// U or u is Used for Unsigned int in C.
int
c = 89U;
// L or l is used for long int in C.
long
int
d = 99998L;
printf
(
"Integer value with positive data: %d\n"
, a);
printf
(
"Integer value with negative data: %d\n"
, b);
printf
(
"Integer value with an unsigned int data: %u\n"
, c);
printf
(
"Integer value with an long int data: %ld"
, d);
return
0;
}
Kết quả:
Trả về 9 giá trị nguyên thuộc tập hợp các số nguyên dương.
Đầu ra với dữ liệu âm là giá trị -9.
Giá trị nguyên với loại dữ liệu int không dấu là 89 giá trị.
Giá trị nguyên với dữ liệu int dài là 99998 giá trị.
Floating-point Numbers
Đối với các kiểu dữ liệu trong C, Floating – point numbers thường được sử dụng để lưu trữ giá trị dấu phảy động các giá trị đó có thể bao gồm số thập phân, các giá trị hàm mũ….. Đây là 1 trong các kiểu dữ liệu thường được sử dụng để lưu trữ các giá trị chứa dấu phẩy với độ chính xác gần như tuyệt đối.
- Phạm vi của Floating-point Numbers : 1.2E-38 đến 3.4E+38
- Kích thước trung bình: 4 byte
- Mã xác định: %f
Ví dụ:
// C Program to demonstrate use
// of Floating types
#include <stdio.h>
int
main()
{
float
a = 9.0f;
float
b = 2.5f;
// 2x10^-4
float
c = 2E-4f;
printf
(
"%f\n"
,a);
printf
(
"%f\n"
,b);
printf
(
"%f"
,c);
return
0;
}
Kết quả đầu ra:
9.000000
2.500000
0.000200
Characters – Các loại ký tự
Các kiểu dữ liệu trong C dạng Characters sẽ chỉ lưu trữ 1 ký tự duy nhất trong một biến liên quan. Với kích thước lưu trữ chỉ 1 byte, nó được xem là dạng lưu trữ dữ liệu cơ bản nhất trong C.
- Phạm vi: (-128 đến 127) hoặc (0 đến 255)
- Kích thước lưu trữ: 1byte
- Mã định dạng: %c
Ví dụ:
// C program to print Integer data types.
#include <stdio.h>
int
main()
{
char
a =
'a'
;
char
c;
printf
(
"Value of a: %c\n"
, a);
a++;
printf
(
"Value of a after increment is: %c\n"
, a);
// c is assigned ASCII values
// which corresponds to the
// character 'c'
// a-->97 b-->98 c-->99
// here c will be printed
c = 99;
printf
(
"Value of c: %c"
, c);
return
0;
}
Kết quả đầu ra:
Value of a: a
Value of a after increment is: b
Value of c: c
Boolean
Boolean là một trong các kiểu dữ liệu trong C phổ biến hiện nay, chúng có thể chứa các giá trị True/False, 0-1 hoặc Yes/No. Với chức năng chính giúp hiển thị các giá trị logic, bên cạnh đó trong lập trình dữ liệu Boolean còn giúp kiểm soát các câu lệnh như if – else.
Bạn có thể viết các tệp lệnh Boolean trong C bằng các cách cơ bản như:
Viết dựa vào các tiêu đề stdbool.h
Tiêu đề Stsbool.h sẽ là điều kiện bắt buộc để có thể sử dụng được dữ liệu kiểu Boolean trong C. Bên cạnh đó, kiểu dữ liệu trong C dạng Boolean thường không có sẵn trong Stdio.h vì thế trong trường hợp này bạn có thể thay thế bằng thư viện stdbool.h.
Ví dụ: cách triển khai dữ liệu Boolean trong thư viện stdbool.h
// C Program to implement
// Boolean data type
#include <stdbool.h>
// Main Function
int
main()
{
// Boolean data types declared
bool
a =
true
;
bool
b =
false
;
printf
(
"True : %d\n"
, a);
printf
(
"False : %d"
, b);
return
0;
}
Kết quả đầu ra:
True: 1
False: 0
Lưu ý: Quá trình triển khai dữ liệu trên nếu bạn sử dụng file dữ liệu dạng .c thì kết quả biên dịch gần như không hiển thị. Nhưng khi bạn sử dụng tệp với định dạng.cpp thì quá trình triển khai dữ liệu sẽ trở nên thuận tiện hơn.
Sử dụng cách viết kiểu liệt kê dữ liệu có liên quan thành 1 nhóm
Bên cạnh cách trên thì bạn có thể triển khai dữ liệu bằng cách liệt kê nhóm dữ liệu có liên quan. Ngoài việc import các dữ liệu trong thư viện thì bạn hoàn toàn có thể khai báo dữ liệu theo dạng liệt kê và sử dụng Boolean làm dữ liệu chính.
Ví dụ:
#include <stdio.h>
typedef
enum
{
false
,
true
}
bool
;
int
main()
{
bool
a =
true
;
bool
b =
false
;
printf
(
"True : %d\n"
, a);
printf
(
"False : %d"
, b);
return
0;
}
Kết quả:
True: 1
False: 0
Khai báo các giá trị Boolean bằng cách sử dụng Define.
Khi sử dụng Define, các giá trị sai sẽ được gián vào int 0 và giá trị thực được gán vào int 1. Ngoài ra, bạn cũng có thể diễn đạt các giá trị số nguyên hoặc các ký tự 1 – true, 0 – False để triển khai các kiểu dữ liệu trong C dạng Boolean.
Ví dụ:
#define bool int
#define false 0
#define true 1
int
main()
{
bool
a =
true
;
bool
b =
false
;
printf
(
"True : %d\n"
, a);
printf
(
"False : %d"
, b);
return
0;
}
Kết quả đầu ra:
True: 1
False: 0
Sử dụng Boolean trong các câu điều kiện
Thông thường kiểu dữ liệu trong C dạng boolean trong câu điều kiện sẽ được biểu đạt dưới dạng câu If – else. Khi kết quả cho ra giá trị a lớn hơn giá trị b hoặc ngược lại thì bạn có thể áp dụng boolean.
Trong các phép toán tử có sử dụng “==”, “>”, “<“, “!=”…… thì đều cho ra kết quả là các giá trị boolean.
Các điều kiện đó có thể giống với ví dụ minh họa dưới đây:
// C Program to implement
// conditional statements
#include <stdbool.h>
#include <stdio.h>
// Main Function
int
main()
{
// Integers declared
int
a = 3;
int
b = 4;
// Conditional Statements
if
(a > b) {
printf
(
"a is greater\n"
);
}
else
{
printf
(
"a is smaller\n"
);
}
printf
(
"%d is the result of a>b"
, a > b);
return
0;
}
Kết quả: a is true
Dùng Boolean trong các vòng lặp
Bool được sử dụng trong các vòng lặp dưới dạng câu điều kiện, khi này chúng có thể xác định được điểm ngắt của các vòng lặp mà không cần sử dụng tới các câu điều kiện trả về. Đặc biệt vòng lặp vô hạn sẽ xảy ra nếu trong các câu điều kiện không xuất hiện vòng lặp.
Ví dụ:
// C Program to demonstrate
// Using bool in loops
#include <stdbool.h>
#include <stdio.h>
// Main Function
int
main()
{
// boolean declared
bool
a =
true
;
int
i = 0;
// while loop
while
(a) {
printf
(
"i is %d\n"
, i);
i++;
// Conditional statement returning
// true or false
// Breaking point for loop
if
(i > 5) {
a =
false
;
}
}
return
0;
}
Kết quả:
i is 0
i is 1
i is 2
i is 3
i is 4
i is 5
Sử dụng Boolean kiểu Return Type (kiểu trả dữ liệu về hàm)
Ngoài các cách trên bạn cũng có thể sử dụng Boolean dạng Return Type. Thực hiện cách này, hệ thống sẽ tự động trả về toàn bộ các giá trị trong hàm mà bạn đã thực hiện trước đó.
Ví dụ:
// C Program to demonstrate using of
// bool as a function return type
#include <stdbool.h>
#include <stdio.h>
// function returning boolean value
bool
is_even(
int
num)
{
if
(num % 2 == 0) {
return
true
;
}
else
{
return
false
;
}
}
// Main function
int
main()
{
// Integer value declared
int
num = 5;
// Function calling
if
(is_even(num)) {
printf
(
"%d is even\n"
, num);
}
else
{
printf
(
"%d is odd\n"
, num);
}
return
0;
}
Kết quả:
5 is odd
Derived Data Types
Bắt nguồn từ những dữ liệu cơ bản nhất, thông thường Derived Data Types sẽ không tạo các dữ liệu mới mà chúng sẽ thêm vào các tính năng bổ sung cho phần tính năng hiện có trong hệ thống.
Arrays – Dữ liệu kiểu mảng
Là tập hợp các mục hoặc các biến có liên quan tới logic có cùng kiểu dữ liệu được lưu ở vị trí giống nhau hoặc liền kề nhau. Tuy nhiên kích thước của mảng trong kiểu dữ liệu này là không thể thay đổi.
Cụ thể hãy quan sát ví dụ sau:
#include<stdio.h>
int main()
{
int arr[10]= {1,7,10,21,3,9,125,729,800,369} ; //declaring the elements of array
int i; //declaring the local variable
printf(“The Elements of array are \n”);
for(i=0; i<10 ;i++)
{
printf(“%d\n”,arr[i]);
}
return 0;
}
Kết quả:
The element of array are
1
7
10
21
3
9
125
779
800
369…..
Program finished with exit code 0
Press ENTER to exit console
Pointers – con trỏ
Pointers sẽ chứa giá trị trong 1 biến bất kỳ và biến này có thể chứa biến khác, hiểu đơn giản thì Pointers có thể nhận giá trị của biến khác làm giá trị của mình và việc truy cập vào con trỏ này cũng là bước để truy cập và quản lý thông tin, địa chỉ trong bộ nhớ.
Ví dụ:
#include <stdio.h>
#include <conio.h>
int main ()
{
int count = 5; //declaring the local variables
int *ptr = &count; //pointer variable
printf(“The value of count variable is %d\n”, count);
printf(“Address of count variable: %x\n”, ptr);
printf(“Value retrieved through pointer : %d\n”, *ptr);
getch();
return 0;
}
Đầu ra:
The value of the count variable is 5
Address of count variable : da5f4764
Value retrieved through pointer : 5
…… program finished with code exit 0
Press ENTER to exit console
Structures
Bao gồm các hàm có dữ liệu các câu lệnh khép kín được sử dụng để thực hiện chức năng cụ thể, bên cạnh đó chúng có thể liên kết với nhau để tạo thành dữ liệu dạng khối hoặc dữ liệu đơn vị duy nhất. Đặc biệt các dữ liệu câu lệnh này được xác định bằng tên thường gọi là tên hàm.
Chính vì thế, mỗi chương trình trong C sẽ bao gồm ít nhất 1 hàm, hàm đó là hàm main ().
Ví dụ:
#include<stdio.h>
int multiplication(); // function declaration
int main()
{
int output; //local variable definition
output = multiplication();
printf(“The product of the two numbers is: %d\n”,output);
return 0;
}
int multiplication()
{
int num1 = 5, num2 = 15;
return num1*num2;
}
Kết quả đầu ra:
The product of the two numbers is: 75
….. program finished with code exit 0
Press ENTER to exit console
Unions – Đồng nhất dữ liệu
Unions kiểu dữ liệu hợp nhất này cũng là 1 trong các kiểu dữ liệu trong C tương tự với Structures. Bên cạnh đó, dung lượng bộ nhớ của kiểu dữ liệu này nó bằng với kích thước của các file liên kết chứa trong đó.
Ví dụ: Nếu có liên kết gồm có 1 float, 5 char và tập hợp gồm 5 số nguyên. Khi này không gian lưu trữ Unions sẽ bằng 20 byte tương ứng với trình biên dịch 64 bit.
Type Modifiers
Signed and Unsigned Modifiers
- Signed được xem là công cụ sửa đổi dữ liệu mặc định của dữ liệu số nguyên (int) hoặc char.
- Unsigned chỉ sử dụng khi bạn lựa chọn được kiểu dữ liệu có thể lưu trữ giá trị số dương phù hợp.
Short and Long Modifiers
- Short: loại dữ liệu lưu trữ giá trị số nguyên với giới hạn trong khoảng từ -32768 đến 32767. Đặc biệt dữ liệu này chỉ sử dụng đối với giá trị số nguyên.
- Long: Ngược với short modifiers, đối với long modifiers bạn có thể lưu trữ số nguyên với các giá trị cực lớn trong phạm vi từ -9223372036854775808 đến 9223372036854775807. Và khi sử dụng kiểu dữ liệu này người ta sẽ thường nhập cú pháp “long long” thay vì “long in”.
Type Casting
Là quá trình chuyển đổi tệp từ kiểu dữ liệu này sang kiểu dữ liệu khác và quá trình này phải được thực hiện bởi lập trình viên. Thêm vào đó, trong quá trình triển khai Type Casting, các kiểu dữ liệu dạng chữ có thể nhỏ hơn so với dữ liệu dạng nguồn, đây có thể là lý do khiến nó được nhiều người biết tới Type Casting với cái tên là chuyển đổi dữ liệu dạng thu hẹp.
Cú pháp:
int x;
float y;
y = (float) x;
Để triển khai kiểu dữ liệu trong C theo type casting thì bạn có thể thực hiện theo 2 phương pháp sau:
Implicit Type Casting
Sử dụng để chuyển đổi dữ liệu chứa trong biến mà không cần sử dụng giá trị thực của biến đó. Quá trình chuyển đổi có thể không thay đổi được giá trị của dữ liệu nhưng chúng có thể tự động thực hiện việc chuyển đổi dữ liệu từ dữ liệu kiểu thấp sang dữ liệu kiểu cao hơn.
Quy trình chuyển đổi dữ liệu sẽ tương ứng với hình minh họa sau:
Explicit type casting
Sử dụng Explicit type casting với datatype không chính xác có thể dẫn tới kết quả đầu ra không chính xác. Trong trường hợp này bạn chỉ có thể điều chỉnh được kết quả đầu ra bằng cách chuyển đổi các kiểu dữ liệu sao cho đồng nhất và phù hợp với nhau.
Ví dụ:
// C program to illustrate the use of
// typecasting
#include <stdio.h>
// Driver Code
int
main()
{
// Given a & b
int
a = 15, b = 2;
float
div
;
// Division of a and b
div
= a / b;
printf
(
"The result is %f\n"
,
div
);
return
0;
}
Kết quả:
The result is 7.000000
Type Conversion
Type Conversion là quá trình chuyển đổi dữ liệu từ dạng này sang dạng khác. Đặc biệt loại chuyển đổi này có thể được thực hiện đối với những loại dữ liệu phù hợp có thể chuyển đổi được.
Đặc biệt đối với kiểu dữ liệu trong C này trong quá trình chuyển đổi dữ liệu đích không được bé hơn dữ liệu nguồn. Hiện tại, có 2 loại chuyển đổi Type Conversion phổ biến nhất là:
Implicit Type Conversion
Loại chuyển đổi này còn được gọi với tên khác là chuyển đổi tự động với đặc điểm cơ bản:
- Chỉ được thực hiện với chương trình do mình làm chủ mà không có bất kỳ can thiệp từ phía khách hàng.
- Quá trình chuyển đổi chỉ diễn ra khi trong biểu thức đó đang chứa nhiều hơn 1 kiểu dữ liệu. Trong trường hợp này nên sử dụng Type Conversion để tránh tình trạng dữ liệu bị mất đi.
- Mọi dữ liệu được nâng cấp lên Implicit Type Conversion sẽ đều là các loại dữ liệu lớn nhất.
- Thông tin khi chuyển đổi dữ liệu có thể bị mất
Ví dụ:
// An example of implicit conversion
#include <stdio.h>
int
main()
{
int
x = 10;
// integer x
char
y =
'a'
;
// character c
// y implicitly converted to int. ASCII
// value of 'a' is 97
x = x + y;
// x is implicitly converted to float
float
z = x + 1.0;
printf
(
"x = %d, z = %f"
, x, z);
return
0;
}
Kết quả:
x = 107, z = 108.000000
Explicit Type Conversion
Đây cũng là 1 dạng dữ liệu phổ biến thuộc Type Conversion và được xác định bởi người dùng. Khi này, người dùng có thể tạo ra kiểu dữ liệu mong muốn bằng cách nhập vào kết quả theo cú pháp (type) expression.
Ví dụ:
// C program to demonstrate explicit type casting
#include<stdio.h>
int
main()
{
double
x = 1.2;
// Explicit conversion from double to int
int
sum = (
int
)x + 1;
printf
(
"sum = %d"
, sum);
return
0;
}
Kết quả: sum = 2
Kích thước và phạm vi của các kiểu dữ liệu trong C
Thông thường các kiểu dữ liệu trong C đều dựa vào các thông tin cơ bản về số nguyên và số thập phân. Khi này từng kiểu dữ liệu sẽ tương ứng với kích thước khác nhau tùy thuộc theo hệ điều hành 32 bit hoặc 64 bit. Trong bảng dưới đây chúng tôi sẽ tập hợp thông tin về kích thước và phạm vi của các kiểu dữ liệu trong C phổ biến và được sử dụng nhiều nhất theo cấu trúc của hệ điều hành 32 bit.
Kiểu | Kích thước lưu trữ | Vùng giá trị |
Int (or signed int) | 2 byte | -32,768 đến 32,767 |
unsigned int | 2 byte | 0 đến 65,535 |
Short int(or signed short int) | 2 byte | -32,768 đến 32,767 |
Long(or signed short int) | 4 byte | -2.147.483.648 đến 2.147.483.647 |
unsigned long | 4 byte | 0 đến 4,294,967,295 |
float | 4 byte | 1,2E-38 đến 3,4E + 38 (6 chữ số thập phân) |
double | 8 byte | 2.3E-308 đến 1.7E + 308 (15 chữ số thập phân) |
Long double | 10 byte | 3,4E-4932 đến 1,1E + 4932 (19 chữ số thập phân) |
char(or signed char) | 1 byte | -128 đến 127 |
unsigned char | 1 byte | 0 đến 255 |
Trên đây là toàn bộ các kiểu dữ liệu trong C quan trọng và phổ biến nhất mà lập trình viên không nên bỏ qua. Mong rằng những thông tin trên đã phần nào giúp bạn hiểu hơn về kiểu dữ liệu trong ngôn ngữ C và đừng quên chia sẻ tới bạn bè nếu thấy bài viết trên hữu ích nhé!
>> Xem thêm: Tổng hợp các loại ngôn ngữ lập trình phổ biến nhất 2023