2011-10-12 30 views
6

Mỗi khi tôi sử dụng từ khóa unsigned, nó đã có trước int hoặc một loại được cài sẵn khác. Tôi đã tự hỏi nếu có bất kỳ cách nào khác unsigned có thể được sử dụng.Từ khóa không dấu có thể được sử dụng theo những cách không rõ ràng không?

  • Các loại người dùng (lớp/cấu trúc) có thể sử dụng từ khóa unsigned không?
  • Các mẫu có thể sử dụng đặc biệt với unsigned không?

Nếu không, tại sao từ khóa của từ khóa lại có từ khóa riêng? Tại sao là unsigned int không phải uint?

+0

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. –

+0

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

+1

Tôi luôn muốn tôi có thể sử dụng 'unsigned' với một lớp 'bigint'. –

Trả lời

4

Không, nó không thể được sử dụng với các lớp hoặc cấu trúc vì chúng không phải là loại không thể tách rời. Tất cả các mẫu có thể làm với nó là tạo một dấu kiểm. Tôi nghĩ rằng nó đã được chọn như là một từ khóa riêng biệt vì nó có thể được áp dụng cho bất kỳ loại số nguyên (char, int, long, long long), do đó đạt được với một từ khóa những gì sẽ có yêu cầu thêm bốn. Ý nghĩa của nó cũng hiển nhiên ngay lập tức, trong khi uint, uchar, vv là không nhất thiết. Và ghi nhớ nó cũng có thể được sử dụng bởi chính nó mà không có một vòng loại, trong trường hợp unsigned int được giả định.

+0

số là sai, thực sự bạn nên nói các loại tích phân. –

+0

Chính xác hơn, tích hợp các loại tích phân. BigInt là một loại không thể thiếu. –

+0

@ 0A0D: Về mặt kỹ thuật, có, nhưng tôi đã sử dụng từ 'số' cụ thể để làm nổi bật thực tế rằng chỉ có các loại số có thể có chất lượng của một dấu hiệu. –

2

Không có ký tự không thực sự là một từ khóa; nó chỉ là một công cụ sửa đổi cho int, short, char.

Từ khóa unsigned có thể được sử dụng như một modifier cho int, short, char, hoặc long. Nó cũng có thể được sử dụng riêng của nó như là một tên kiểu; unsigned có nghĩa là unsigned int. Nó đã được thực hiện theo cách đó để tránh có thêm ba từ khóa uint ushort uchar và bởi vì ký/unsigned có thể không có khác nhau trên tất cả các máy tính đầu C và Unix được nhắm vào.

+0

tốt, thực sự nó là một 'loại-specifier' không' modifier'. Xem 7.1.5 trong tiêu chuẩn ISO C++. –

+0

Xem [link] này (http://en.cppreference.com/w/cpp/keywords/unsigned) – COD3BOY

+1

@Sanjay: Tôi không quan tâm điều gì nói, hãy đọc tiêu chuẩn ISO trong 7.1.5. http://www-d0.fnal.gov/~dladams/cxx_standard.pdf –

3

unsigned là từ khóa. unsigned chỉ có thể được sử dụng trên tích phân loại. unsigned hoặc signed được coi là một loại-specifier, một loại-specifier đơn giản. Vì vậy, họ chỉ định rằng loại sẽ bằng ký hoặc không được ký.

Bạn có thể typedef những lời unsigned int để uint nhưng sau đó mà có thể làm cho nó trông giống như một loại khi int là loại và unsigned là type-specifier cho mỗi gia nhập.

Bạn có thể sử dụng unsigned bởi chính nó, trái với niềm tin phổ biến, được minh chứng trong các Mục Tiêu chuẩn C++ ISO 7.1.5.2 Bảng 7:

enter image description here

Bạn có thể sử dụng nhiều loại-specifiers (khi chỉ được phép) và có thể được trộn tự do với các trình khai báo giảm theo thứ tự bất kỳ.

Bạn cũng có thể làm điều này:

int unsigned i; 

và đây là hợp lệ C++.

1

Từ khóa được ký, chưa ký, ngắn và dài là các công cụ sửa đổi/chỉ định loại và Khi một trong các loại công cụ sửa đổi/chỉ định này được sử dụng bởi chính nó, một kiểu dữ liệu của int được giả định.

Vì vậy, đã ký và chưa ký cũng có thể là used as standalone type specifiers, có nghĩa là tương tự như int đã ký và int chưa ký tương ứng. Hai tờ khai sau là tương đương:

unsigned abc; 

unsigned int abc; 
5

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

0

Ngoài ra còn có unsigned char. Một số trình biên dịch, chẳng hạn như g ++ của GNU, cho phép bạn đặt unsigned và giả sử bạn có nghĩa là unsigned int. Ví dụ: mã sau đây tương đương

unsigned int x; 

unsigned x; 
Các vấn đề liên quan