Cho đoạn mã sau: short s = 5L; Phát biểu nào sau đây đúng với đoạn mã trên?
Trả lời:
Đáp án đúng: A
Trong đoạn mã `short s = 5L;`, chúng ta đang cố gắng gán một giá trị kiểu `long` (5L) cho một biến kiểu `short`. Trong Java (và nhiều ngôn ngữ khác), `short` là một kiểu dữ liệu số nguyên nhỏ hơn `long`.
Việc gán một giá trị lớn hơn (kiểu `long`) cho một biến nhỏ hơn (kiểu `short`) có thể gây ra mất mát dữ liệu hoặc tràn số, vì kiểu `short` có thể không đủ chỗ để chứa toàn bộ giá trị của kiểu `long`. Tuy nhiên, trong trường hợp này, giá trị 5L (5 kiểu long) nằm trong phạm vi biểu diễn của kiểu short. Vì vậy, trình biên dịch Java sẽ tự động thực hiện thu hẹp kiểu (implicit narrowing conversion) từ long về short mà không báo lỗi biên dịch.
Dù không có lỗi biên dịch, việc thu hẹp kiểu có thể dẫn đến mất độ chính xác nếu giá trị của kiểu long vượt quá phạm vi của kiểu short. Trong trường hợp này, giá trị 5 nằm gọn trong cả hai kiểu, nhưng nếu giá trị lớn hơn phạm vi của short (-32768 đến 32767) thì sẽ có mất mát dữ liệu.
Vì vậy, đáp án chính xác nhất là D. Mất Độ Chính Xác (loss of accuracy), mặc dù trong trường hợp cụ thể này giá trị không bị mất, nhưng việc gán kiểu có nguy cơ này.