Trong bài này chúng ta sẽ học cách ép kiểu dữ liệu (casting) trong C. Khi lập trình trong một số trường hợp tính toán cụ thể hoặc cần biểu diễn giá trị dưới những định dạng khác nhau, chúng ta cần thực hiện ép kiểu để chuyển đổi qua lại những kiểu dữ liệu có khả năng lưu trữ giá trị giống nhau
Bài 15 trong Serie Học lập trình C từ A tới Z
Ép kiểu là gì?
Ép kiểu là hành động thay đổi kiểu dữ liệu của một biến (hoặc biểu thức) bất kỳ sáng một kiểu dữ liệu khác.
Ví dụ:
- x=15.3456 (x là số thực, x ∈ R) và bạn muốn ép kiểu x thành một số nguyên (x ∈ Z). Sau khi ép kiểu, x=15. Bỏ phần sau dấu phẩy
- y=978 (y là số nguyên, y ∈ Z) và bạn muốn ép kiểu x thành một số thực (y ∈ R). Sau khi ép kiểu, y=987.000… . Thêm phần sau dấu phấy
Khi nào cần ép kiểu?
- Đưa dữ liệu về định dạng mà mình mong muốn giúp xử lý cho thuật toán.
- Khởi tạo hoặc gán một biến với giá trị của một kiểu dữ liệu khác.
- Kiểu dữ liệu của biến trả về kết quả khác với kiểu dữ liệu trả về của hàm đó.
Các loại ép kiểu dữ liệu
Ép kiểu dữ liệu ngầm định
Trong quá trình biên dịch, nếu phát hiện 1 lệnh gán giá trị khác loại cho 1 biến, trình biên dịch sẽ tự động chuyển kiểu, gọi là cơ chế chuyển kiểu ngầm định.
Trình biên dịch sẽ hiện cảnh báo nếu xuất hiện sự chuyển kiểu không an toàn, gây mất mát giá trị, ví dụ như chuyển 1 dữ liệu có kích thước lớn, mang giá trị lớn về kiểu dữ liệu có kích thước nhỏ, hay dữ liệu số có dấu sang kiểu dữ liệu không dấu đều là chuyển kiểu không an toàn.
Khi tính toán 1 biểu thức, ví dụ như các phép toán số học, các hạng tử cần phải có cùng 1 kiểu thì việc tính toán mới diễn ra, nếu các hạng tử không cùng kiểu, sẽ xảy ra chuyển kiểu ngầm định, kiểu nhỏ hơn sẽ chuyển sang kiểu lớn hơn. Có dãy cấp độ như sau:
double d = 13; // tự động chuyển giá trị của d thành 13.0 int n = 16.95; // tự động chuyển giá trị của n thành 16
Tại sao int
lại là kiểu dữ liệu nhỏ nhất trong dãy, còn short
và char
ở đâu? Khi tính toán, kiểu dữ liệu short
và char sẽ tự động được chuyển sang int
.
Xét biểu thức sau:
int n = 10 + 16.95;
Biểu thức bên phải là phép toán cộng giữa kiểu int
(10
) và kiểu double
(16.95
), khi đó 10 sẽ được chuyển kiểu thành 10.0
và phép toán trở thành 10.0 + 16.95
, kết quả là 26.95
, được gán cho n
là 1 biến int
nên được chuyển kiểu và n
= 26
.
Ép kiểu dữ liệu tường minh
Là việc chuyển 1 dữ liệu sang kiểu dữ liệu khác theo ý muốn của lập trình viên. Kiểu biến đổi này có thể làm mất thông tin. Cú pháp chuyển kiểu như sau:
(<kiểu dữ liệu>)<dữ liệu cần chuyển>
VD:
int n = 10; float f = (float)n; // chuyển kiểu tường minh
Khi bắt đầu lập trình, có một lỗi phổ biến thường mắc phải là nhầm lẫn giữa phép chia các số nguyên trong toán học và phép chia các số nguyên trong lập trình, dẫn đến kết quả lập trình không được như mong muốn.
VD:
float f = 10 / 4;
Mong muốn kết quả f
= 2.5
nhưng quy ước trong C là khi hai số nguyên chia nhau thì kết quả lấy phần nguyên do đó f
= 2
. Khắc phục như sau:
float f = ((float)10) / 4; // chuyển kiểu tường minh
Hoặc 1 cách khác:
float f = (1.0 * 10) / 4; // chuyển kiểu ngầm định
Kết
Nếu thấy có ích hãy chia sẻ bài viết và tham gia nhóm Nghiện Lập Trình để giao lưu và học hỏi nhé