Về động lực: cho phép tưởng tượng thay thế cho hành vi này và xem tại sao họ không làm việc:
Alternative 1: kết quả nên luôn luôn giống như các đầu vào .
Kết quả sẽ là gì khi thêm int và ngắn?
Kết quả là gì để nhân hai quần short? Kết quả nói chung sẽ phù hợp với một int, nhưng bởi vì chúng tôi cắt ngắn để ngắn, hầu hết các phép nhân sẽ không âm thầm. Truyền tới một int sau đó sẽ không giúp ích gì.
Phương án 2: kết quả luôn là loại nhỏ nhất có thể đại diện cho tất cả các kết quả đầu ra có thể.
Nếu loại trả về là ngắn, câu trả lời sẽ không phải lúc nào cũng thể hiện được.
Một giá trị ngắn có thể chứa -32,768 đến 32,767. Sau đó, kết quả này sẽ gây ra tràn:
short result = -32768/-1; // 32768: not a short
Vì vậy, câu hỏi của bạn sẽ trở thành: tại sao thêm hai int không trả lại lâu? Nhân của hai int là gì? Dọc theo? Một BigNumber để bao gồm trường hợp của giá trị số nguyên min bình phương?
Cách 3: Chọn điều hầu hết mọi người có thể muốn phần lớn thời gian
Vì vậy, kết quả nên là:
- int cho nhân hai quần short, hoặc bất kỳ int hoạt động.
- ngắn nếu thêm hoặc trừ quần short, phân chia ngắn theo bất kỳ loại số nguyên nào, nhân hai byte, ...
- byte nếu bithifting byte sang phải, int nếu bitshifting sang trái.
- etc ...
Nhớ tất cả các trường hợp đặc biệt sẽ khó nếu không có logic cơ bản cho chúng. Nó đơn giản hơn để chỉ nói: kết quả của các hoạt động số nguyên luôn luôn là một int.
Nguồn
2010-02-13 08:46:10
Vì việc chuyển đổi một đoạn ngắn thành một đoạn ngắn sẽ làm mất độ chính xác. (-32768/-1) –