Câu hỏi chính đã được trả lời nhiều lần: từ khóa unsigned
chỉ có thể được sử dụng như một loại-specifier cho một loại không thể thiếu.
Vì lý do tại sao unsigned
là từ khóa riêng biệt, thay vì có, giả sử, một từ khóa uint
, lý do là lịch sử.
Các phiên bản sớm nhất của C (pre-K & R) chỉ có bốn loại cơ bản:
char
(8 bit, ký kết, 2's-bổ sung)
int
(16 bit, ký kết, 2 của -complement)
float
(32 bit)
double
(64 bit, cùng phạm vi như float
nhưng chính xác hơn)
Ghi chú nội dung bị thiếu: không signed
hoặc unsigned
từ khóa, không short
, long
hoặc long double
; tất cả những thứ này được thêm vào sau. (Các lập trình viên cần các số học không dấu được sử dụng phổ biến, được tự do hoán đổi cho nhau với int
.)
Mỗi loại cơ bản đều có một từ khóa đơn giản, làm cho ngữ pháp trở nên đơn giản.
Khi loại khác đã được thêm vào sau đó, nó làm cho tinh thần để thêm specifiers như unsigned
, short
, và long
với tên loại hiện có thay vì đưa ra các từ khóa mới (mà có thể đã phá vỡ mã hiện tại). Khi ủy ban ANSI C chuẩn hóa ngôn ngữ vào năm 1989, họ phải tạo ra một cấu trúc mạch lạc từ các định nghĩa không chính thức hiện có trong khi vẫn phù hợp với các triển khai hiện có. Kết quả là những gì chúng tôi có bây giờ, trong đó int long unsigned long
là tên loại hợp lệ (thường được viết là unsigned long long
).
Nếu ngôn ngữ đã được thiết kế ngay từ đầu, tôi nghi ngờ rằng một cách tiếp cận khác sẽ được thực hiện. Có lẽ sẽ có một từ khóa duy nhất cho mỗi loại cơ bản (đó là cách tiếp cận của C# chẳng hạn), hoặc có lẽ tên kiểu cơ bản sẽ sử dụng một sơ đồ mạch lạc hơn là một từ khóa lộn xộn (ví dụ: int:2
cho 2 byte) số nguyên, unsigned:4
cho số nguyên không dấu 4 byte). Nhưng cả C và C++ đều bị mắc kẹt với cách tiếp cận hiện tại.
tham khảo: http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf
Nguồn
2011-10-12 18:14:38
Trừ khi bạn có nghĩa là sử dụng 'unsigned' (tương đương với' unsigned int'), tôi không thể nghĩ ra bất kỳ trường hợp sử dụng * lạ * nào khác. –
Tiêu đề của câu hỏi này và câu hỏi cuối cùng ... trong văn bản khá khác nhau. Đó là cái nào? – Jon
Tôi luôn muốn tôi có thể sử dụng 'unsigned' với một lớp 'bigint'. –