Số học chế độ hỗn hợp (số học giữa các toán hạng của các loại và/hoặc kích thước khác nhau) là hợp pháp nhưng mong manh. Tiêu chuẩn C định nghĩa các quy tắc cho quảng cáo loại để chuyển đổi các toán hạng thành một biểu diễn chung. Tự động loại khuyến mãi cho phép trình biên dịch để làm một cái gì đó hợp lý cho các hoạt động chế độ hỗn hợp, nhưng "hợp lý" không nhất thiết có nghĩa là "chính xác".
Để thực sự biết liệu hành vi có chính xác hay không, trước tiên bạn phải hiểu các quy tắc về quảng cáo và sau đó hiểu được sự đại diện của các loại dữ liệu. Trong thuật ngữ rất chung:
- ngắn hơn các loại được chuyển đổi sang loại dài hơn (
float
để double
, short
để int
, vv)
- loại nguyên được chuyển đổi thành các loại dấu chấm động
- ký/unsigned chuyển đổi ưu tiên tránh mất dữ liệu (cho dù đã ký được chuyển thành chưa ký hoặc ngược lại phụ thuộc vào kích thước của các loại tương ứng)
Cho dù mã như x > y
(trong đó x
và y
có các loại khác nhau) là đúng hay sai phụ thuộc vào các giá trị x
và y
có thể thực hiện. Theo kinh nghiệm của tôi, thực tế phổ biến là cấm chuyển đổi kiểu ngầm (thông qua mã hóa tiêu chuẩn). Lập trình viên phải xem xét ngữ cảnh và thực hiện rõ ràng bất kỳ chuyển đổi loại nào cần thiết.
Nguồn
2009-04-17 18:19:50
Cảm ơn, vì vậy điều đó có nghĩa là nếu f = 1.0162 nó sẽ là int f == 1, vì vậy tôi sẽ chỉ phải mở rộng nó, f * = 1000; vì vậy int f == 1016 để giữ lại độ chính xác? – sevenboarder
Bạn không thể đại diện cho tất cả các số nguyên chính xác như phao. Không phải với mantissa 24-bit của phao. Nếu nó là gấp đôi, có, nhưng không nổi :) – Joey
@Johannes, bạn nói đúng, tôi đang ghi nhớ sai một câu hỏi tôi đã trả lời gần đây, cập nhật để sửa chữa. – paxdiablo