4.2.9 Promotions

Để tránh cả hai loại thiệt hại (mất gái trị và mất độ chính xác), trình biên dịch sử dụng một chiến lược gọi là promotions.

Ví dụ về promotions: khi một biến int và một biến short được sử dụng trong cùng một biểu thức, chúng ta có thể mong đợi rằng giá trị của dải hẹp (short) sẽ được thăng cấp lên loại có phạm vi rộng hơn (int) và sẽ không mất giá trị.

Tương tự như vậy, khi một biến float gặp một biến double trong cùng một biểu thức, float sẽ thăng cấp lên double

Tất cả các promotions được thực hiện theo các quy tắc sau đây (các quy tắc được áp dụng theo thứ tự dưới đây cho đến khi tất cả các dữ liệu được sử dụng trong một biểu thức cụ thể có cùng một kiểu- điều kiện này là rất quan trọng!)

  • Dữ liệu kiểu char hoặc short khi gặp kiểu int sẽ được chuyển đổi sang kiểu int (integer promotion)
  • Dữ liệu kiểu float khi gặp kiểu double sẽ được chuyển đổi sang kiểu double (floating point promotion)
  • Nếu có bất kỳ giá trị của kiểu double nào trong biểu thức, các dữ liệu khác sẽ được chuyển đổi sang kiểu double
  • Nếu có bất kỳ giá trị kiểu long trong biểu thức, các dữ liệu khác sẽ được chuyển đổi sang long

Để hiểu chuyển đổi ngầm định làm việc như thế nào, chúng ta có thể phân tích quá trình tính toán giá trị của biểu thức trong ví dụ sau đâu →

Có các chuyển đổi kiểu dữ liệu ngầm định sau đây sẽ xảy ra trong ví dụ trên

  • Đầu tiên là một phép promotions:

int(Short) + int(Char)

  • Tổng của Short và Char cũng như biến Float sẽ được chuyển thành kiểu double

double((int(Short) + int(Char)) + double(Float))

  • Tổng cuối cùng sẽ được tính là kiểu double, nhưng do ngữ cảnh (phát sinh từ kiểu của đối số bên trái của toán tử =) là int, một chuyển đổi khác thành một kiểu int  sẽ diễn ra. Do đó, dạng cuối cùng của biểu thức sẽ trông như thế này

int(double((int(Short) + int(Char)) + double(Float)))

Bây giờ bạn hãy thử tự thực hiện một số thí nghiệm bằng cách thay đổi kiểu của các biến liên quan đến biểu thức và kiểu của biến đích. Tiếp tục thử nghiệm cho đến khi bạn chắc chắn hiểu được hoạt động của các chuyển đổi.