Việc chuyển đổi một kiểu dữ liệu (data type) này thành một kiểu dữ liệu khác được gọi là ép kiểu (type casting) hoặc chuyển đổi kiểu (type-conversion). Ví dụ trong lập trình C, nếu bạn muốn lưu trữ một giá trị kiểu ‘long’ vào một số nguyên (integer) đơn giản thì bạn có thể ép kiểu ‘long’ thành ‘int’.
Bạn có thể chuyển đổi các giá trị từ kiểu này sang kiểu khác một cách tường minh bằng cách sử dụng toán tử ép kiểu (cast operator) như sau:
(type_name) expression
Hãy xem xét ví dụ dưới đây, trong đó toán tử ép kiểu khiến phép chia một biến số nguyên cho một biến số nguyên khác được thực hiện như một phép toán dấu chấm động (floating-point operation).
main() { int sum = 17, count = 5; double mean; mean = (double) sum / count; printf("Value of mean : %f\n", mean ); }
Khi đoạn code trên được biên dịch và thực thi, nó sẽ cho kết quả như sau.
Value of mean : 3.400000
Ở đây cần lưu ý rằng toán tử ép kiểu được ưu tiên hơn phép chia, vì vậy giá trị của tổng sum trước tiên được chuyển đổi thành kiểu double và sau đó nó mới được chia cho số đếm count tạo ra giá trị double.
Các chuyển đổi kiểu có thể được trình biên dịch hiểu ngầm, thực hiện tự động hoặc có thể được thể hiện công khai thông qua việc sử dụng toán tử ép kiểu (cast operator). Người ta coi một thói quen lập trình tốt là sử dụng toán tử ép kiểu (tường minh) bất kỳ lúc nào gặp chuyển đổi kiểu.
Thăng Cấp Số Nguyên (Integer Promotion)
Thăng cấp số nguyên (integer promotion) là quá trình mà các giá trị của kiểu số nguyên “nhỏ hơn” int hoặc unsigned int được chuyển đổi thành int hoặc unsigned int. Hãy xem xét một ví dụ về phép cộng một ký tự (character) với một số nguyên (integer).
#include <stdio.h> main() { int i = 17; char c = 'c'; /* ascii value is 99 */ int sum; sum = i + c; printf("Value of sum : %d\n", sum ); }
Khi đoạn code trên được biên dịch và thực thi, nó sẽ cho kết quả như sau.
Value of sum : 116
Ở đây, giá trị của sum là 116 vì trình biên dịch đã thực hiện việc thăng cấp số nguyên và chuyển đổi giá trị của ‘c’ thành ASCII trước khi thực hiện thao tác cộng thực sự.
Chuyển Đổi Số Học Thông Thường
Các chuyển đổi số học thông thường (usual arithmetic conversions) được thực hiện ngầm định để ép các giá trị của chúng thành một kiểu chung. Trình biên dịch đầu tiên thực hiện việc thăng cấp số nguyên; nếu các toán tử (operand) vẫn có kiểu khác nhau, thì chúng được chuyển đổi thành kiểu cao nhất trong sơ đồ phân cấp sau:
Các chuyển đổi số học thông thường không được thực hiện cho các toán tử gán (assignment operator), cũng không phải cho các toán tử logic && và ||. Chúng ta hãy xem ví dụ sau để hiểu khái niệm này.
#include <stdio.h> main() { int i = 17; char c = 'c'; /* ascii value is 99 */ float sum; sum = i + c; printf("Value of sum : %f\n", sum ); }
Sau khi biên dịch, đoạn code trên khi thực thi sẽ cho kết quả sau:
Value of sum : 116.000000
Ở đây, có thể hiểu đơn giản rằng biến c trước tiên được chuyển đổi thành ineger, nhưng vì giá trị cuối cùng là float. Áp dụng chuyển đổi số học thông thường và trình biên dịch chuyển đổi biến i và c thành ‘float’ và cộng lại để tạo ra kết quả ‘float’.
Xem thêm Usual Arithmetic Conversions từ Microsoft.