Để hiểu vì sao lại cần ép kiểu dữ liệu, ta cần nhìn vào thực tế.
Một ví dụ rất thông thường đó là việc mua bán hàng hóa.
Thông thường, số lượng hàng hóa sẽ dùng một biến kiểu int để biểu diễn, ví dụ:
int soLuong;
Giá cả hàng hóa thường có phần thập phân, vì vậy tối ưu nhất là dùng một biến dàn float để biểu diễn giá, ví dụ:
float giaHang;
Giá trị của đơn hàng sẽ là một số dạng float, ví dụ
float tongDonHang;
Trong nhiều trường hợp, việc tính tổng giá trị đơn hàng không có vấn đề gì. Nhưng trong nhiều trường hợp sẽ phát sinh sự cố không lường trước, vì vậy ta cần chuyển đổi tất cả về cùng một kiểu dữ liệu, còn gọi là ép kiểu dữ liệu-Type Casting.
Ép kiểu trong C là việc gán giá trị của một biến có kiểu dữ liệu này tới biến khác có kiểu dữ liệu khác.
Cú pháp:
(type) value;
Ép kiểu ngầm định - Implicit Type Casting là khi chuyển đổi kiểu dữ liệu mà không làm mất đi giá trị ban đầu của biến.
Ép kiểu ngầm định được thực hiện một cách tự động khi bạn gán giá trị của một biến này cho biến khác mang kiểu dữ liệu tương thích, thường là kiểu dữ liệu bao hàm. Ví dụ bạn có thể gán giá trị của 1 biến int vào biến long long mà không làm mất giá trị ban đầu của biến int.
Ví dụ với chương trình tào lao của chúng ta, bạn khai báo một biến kiểu long long như sau.
long long so2 = so;
Sau đó in ra màn hình với lệnh printf:
printf("Gia tri cua bien so2 là %lld \n", so2);
Đây là chương trình của chúng ta:
/* Đây là chương trình tào lao */
#include <stdio.h>
int main()
{
int so = 2024; // Đây là biến số
char namtoi[] = "Năm 2025"; // Đây là biến chuỗi
float a = 8.3462326543;
double b = 10.8745634535333;
int n;
char Ten;
int soTien;
int soNam;
int tongSoTien;
int x = 15 < 25 ? 100 : 200;
int diBien1= (10 < 20) && (20 >= 20);
int diBien2= (10 > 20) || (20 < 10);
so +=10;
long long so2 = so;
printf("Xin Chào ! \n");
printf("Rất vui gặp bạn!");
printf("Năm nay là %d \n", so);
printf("Năm tới là %s", namtoi);
printf("In 4 chữ số sau dấu phẩy : %.4f\n", a);
printf("In 5 chữ số sau dấu phẩy : %.5lf\n", b);
printf("Hãy nhập một số từ 1-100: ");
scanf("%d", &n);
printf("Gía trị của n là : %d\n", n);
printf("Nhap tên của bạn, chỉ một chữ A,B,C : ");
scanf(" %c", &Ten);
printf("Tên bạn là : %c\n", Ten);
printf("Hãy nhập số tiền gửi hàng tháng: ");
scanf("%d", &soTien);
printf("Hãy nhập tổng số năm đã tiết kiệm: ");
scanf("%d", &soNam);
tongSoTien = (soTien * 12) * soNam;
printf("Xin chào: %c, sau %d nam kien tri tich luy, ban da kiem đươc %d .Xin chuc mung ban!", Ten, soNam, tongSoTien);
printf("%d\n", x);
printf("%d, %d\n", diBien1,diBien2);
printf("%d ", 100 > 50);
printf("%d ", 20 <= 30);
printf("%d ", 80 >= 100);
printf("Gia tri cua bien so2 là %lld \n", so2);
return 0;
}
Bấm Run để chạy chương trình, ta sẽ thấy về mặt giá trị hai biến so và so2 đều cùng giá trị, nhưng về bản chất khác kiểu dữ liệu: biến so có kiểu dữ liệu là int, biến so2 có kiểu dữ liệu là long long.
Ép kiểu tường minh - Explicit type casting được thực hiện bởi lập trình viên trong một vài tình huống bắt buộc.
Ví dụ bạn cần tìm thương của phép chia 2 số nguyên và muốn lấy phần thập phân của phép chia, khi đó bạn bắt buộc phải sử dụng số chia hoặc số bị chia là một số thực vì nếu chia 2 số nguyên thì mặc định phần thập phân sẽ không được giữ lại. Quá trình này sẽ được xử lý bằng cách ép kiểu sang số thực float hoặc double.
Cú pháp:
(type) value;
Chúng ta hoàn toàn có thể lấy ví dụ đơn giản bên trên để thử. Ta có thể thêm kiểu dữ liệu vào trước biến so như sau:
long long so2 = (long long) so;
Khi bấm Run để chạy chương trình, mọi thứ đều ổn.
Hãy xét một ví dụ khác.
Thêm hai biến, biến so3 có kiểu dữ liệu float, được gán giá trị là 35.82. Biến so4 có kiểu dữ liệu là int, được khởi tạo với giá trị biến so3 (được ép kiểu dữ liệu) cộng 1
float so3 = 35.82;
int so4 = (int)so3 + 1;
Dùng lệnh printf để in kết quả:
printf("Gia trị so4 là %d \n", so4);
Chương trình sẽ như thế này:
/* Đây là chương trình tào lao */
#include <stdio.h>
int main()
{
int so = 2024; // Đây là biến số
char namtoi[] = "Năm 2025"; // Đây là biến chuỗi
float a = 8.3462326543;
double b = 10.8745634535333;
int n;
char Ten;
int soTien;
int soNam;
int tongSoTien;
int x = 15 < 25 ? 100 : 200;
int diBien1= (10 < 20) && (20 >= 20);
int diBien2= (10 > 20) || (20 < 10);
so +=10;
long long so2 = so;
float so3 = 35.82;
int so4 = (int)so3 + 1;
printf("Xin Chào ! \n");
printf("Rất vui gặp bạn!");
printf("Năm nay là %d \n", so);
printf("Năm tới là %s", namtoi);
printf("In 4 chữ số sau dấu phẩy : %.4f\n", a);
printf("In 5 chữ số sau dấu phẩy : %.5lf\n", b);
printf("Hãy nhập một số từ 1-100: ");
scanf("%d", &n);
printf("Gía trị của n là : %d\n", n);
printf("Nhap tên của bạn, chỉ một chữ A,B,C : ");
scanf(" %c", &Ten);
printf("Tên bạn là : %c\n", Ten);
printf("Hãy nhập số tiền gửi hàng tháng: ");
scanf("%d", &soTien);
printf("Hãy nhập tổng số năm đã tiết kiệm: ");
scanf("%d", &soNam);
tongSoTien = (soTien * 12) * soNam;
printf("Xin chào: %c, sau %d nam kien tri tich luy, ban da kiem đươc %d .Xin chuc mung ban!", Ten, soNam, tongSoTien);
printf("%d\n", x);
printf("%d, %d\n", diBien1,diBien2);
printf("%d ", 100 > 50);
printf("%d ", 20 <= 30);
printf("%d ", 80 >= 100);
printf("Gia tri cua bien so2 là %lld \n", so2);
printf("Gia trị so4 là %d \n", so4);
return 0;
}
Bấm Run để chạy chương trình. Kết quả biến so4 có giá trị là 36 (kiểu int)
Trong ví dụ này, đầu tiên giá trị dấu biến float so3 được đổi thành giá trị nguyên 35. Sau đó nó được cộng với 1 và kết quả là giá trị 36 được lưu vào so4.
Không có nhận xét nào:
Đăng nhận xét