2010-08-28 45 views
12

thể trùng lặp:
Why doesn't C have unsigned floats?Tại sao không có loại dấu phẩy động không dấu?

Câu hỏi đặt ra có lẽ là rất cơ bản và có lẽ đã trả lời nhiều lần trước đó, nhưng tôi muốn hiểu lý do tại sao C++ không có kiểu dấu chấm động unsigned, mặc dù các ký hiệu dấu chấm động có thể được ký hoặc không dấu.

$ 3.9.1/8- "Có ba loại nổi loại: float, double và long double."

+0

@Greg Hewgill: Yup, đã thay đổi tên bạn thân. – Chubsdad

+0

@Greg Hewgill: được cập nhật theo nhận xét của bạn. – Chubsdad

+0

Chữ nổi dấu chấm luôn được ký theo dạng * loại *. Có hay không bạn tiền tố rõ ràng với +/- không thay đổi đó và suffixing với U hoặc LU như bạn sẽ là một số nguyên chữ để ép buộc loại là một lỗi. – Clifford

Trả lời

22

Các loại số nguyên không dấu có hai thuộc tính quan trọng phân biệt chúng với các loại số nguyên đã ký: phạm vi "chuyển" (không có khoảng trắng phủ định, nhưng phân số dương gấp hai lần) và số học modulo. Đối với các kiểu số nguyên, các thuộc tính này đủ quan trọng để biện minh cho sự tồn tại của các kiểu unsigned.

Với các loại thả nổi, cả hai thuộc tính này đều không thể áp dụng ngay lập tức. Với các loại dấu phẩy động, vấn đề chính không nằm trong phạm vi của chúng (đối với nhiều mục đích, nó có thể được coi là hầu như vô hạn), nhưng đúng hơn là chính xác. Và số học modulo không phải là tự nhiên áp dụng cho các loại không nguyên. Vì lý do này, nó không có ý nghĩa nhiều khi giới thiệu các loại dấu phẩy động không dấu, tức là nó không có ý nghĩa gì với việc lật ngược vai trò của một chút trong biểu diễn dấu phẩy động. Cũng cần lưu ý rằng lý do trên có lẽ nên được sử dụng như lý do đằng sau việc đưa vào các loại số nguyên không dấu (và không giới thiệu các loại dấu phẩy động không dấu) trong phần cứng phổ biến và các tiêu chuẩn có nguồn gốc tương ứng. Những gì chúng ta có trong C và C++ về cơ bản được thừa hưởng từ các khả năng phần cứng và các tiêu chuẩn này.

Tất nhiên, từ điểm khái niệm nếu xem, sẽ khá hợp lý khi có các loại dấu phẩy động không dấu trong ngôn ngữ, chỉ vì mục đích nhất quán. Nhưng, họ không có ở đó.

+0

Chấp nhận câu trả lời cuối cùng cho câu lệnh cuối cùng: "Tất nhiên, từ quan điểm nếu quan điểm, sẽ khá hợp lý nếu có các loại dấu phẩy động không được ký hiệu trong ngôn ngữ, chỉ vì lợi ích của sự nhất quán. Nhưng, họ không có ở đó. " Ngoài ra lý do về "đủ quan trọng để biện minh cho sự tồn tại" có vẻ đúng, mặc dù tôi không phải là chuyên gia trong C++ – Chubsdad

+0

Cần lưu ý rằng hành vi trừ một giá trị chưa ký lớn hơn từ một giá trị nhỏ hơn được xác định rõ, nhưng có không có ý nghĩa rõ ràng để trừ một phao lớn hơn từ một cái nhỏ hơn, khác hơn là báo cáo một kết quả tiêu cực. – supercat

6

Tất cả các dấu phẩy động đều được ký. C++ theo tiêu chuẩn IEEE 754, là phần cứng phổ biến nhất và sau đó, các phao luôn được ký.

Khi các phao đã chiếm ít nhất 32 bit, mức tăng của việc thực hiện phần mềm sẽ lấy lại được 1 bit không đáng kể so với tính hữu ích của việc triển khai như vậy.

+1

Tôi sẽ bỏ qua "theo mặc định", vì không có bất kỳ sự thay thế nào khác. –

+0

Về cơ bản, tôi đã xem xét một cách để tránh biến kiểu double/float khi lấy giá trị âm, bằng cách nói một cái gì đó như 'unsigned double' – Chubsdad

+0

@Greg, đã sửa. –

Các vấn đề liên quan