2011-10-12 33 views
6

每次我使用unsigned關鍵字時,它一直在int之前,或其他內置類型。 我想知道是否有其他方式unsigned可以使用。可以用非明顯的方式使用unsigned關鍵字嗎?

  • 用戶定義的類型(類/結構)可以使用unsigned關鍵字嗎?
  • 模板可以特別用於unsigned嗎?

如果不是,爲什麼它有自己的關鍵字?爲什麼是unsigned int而不是uint

+0

除非你的意思是使用'unsigned'本身(相當於'unsigned int'),我想不出任何其他*奇怪的用例。 –

+0

這個問題的標題和文中的最後一個問題是完全不同的。哪一個? – Jon

+1

我一直希望我可以使用'unsint'和'bigint'類。 –

回答

4

不,它不能用於類或結構體,因爲它們不是整型。所有的模板可以做的是使一個int無符號。我認爲它被選爲一個單獨的關鍵字,因爲它可以應用於任何整數類型(char,int,long,long long),從而實現一個關鍵字需要四個以上的關鍵字。它的含義也立即明顯,而uint,uchar等不一定。並且請記住它也可以在沒有限定符的情況下使用,在這種情況下,假定爲unsigned int。

+0

數字是錯誤的,實際上你應該說整數類型。 – 2011-10-12 17:13:15

+0

更準確地說,內置的整型類型。 BigInt是一個完整的類型。 –

+0

@ 0A0D:從技術上來說,是的,但我特別使用了「數字」這個詞來強調只有數字類型才能具有符號質量的事實。 –

2

沒有unsigned並不是真正的關鍵字;它只是int,short,char的修飾符。

unsigned的關鍵字可被用作一個改性劑intshortchar,或long。它也可以作爲一個類型名稱使用; unsigned意味着unsigned int

這樣做是爲了避免使用三個額外的關鍵字uint ushort uchar,並且因爲C和Unix所針對的所有早期計算機上的signed/unsigned可能都沒有不同。

+0

好吧,實際上它是一個「類型說明符」而不是「修飾符」。見C++ ISO標準中的7.1.5。 – 2011-10-12 17:12:50

+0

看到這個[鏈接](http://en.cppreference.com/w/cpp/keywords/unsigned) – COD3BOY

+1

@Sanjay:我不在乎那是什麼說的,去閱讀7.1.5中的ISO標準。 http://www-d0.fnal.gov/~dladams/cxx_standard.pdf – 2011-10-12 17:16:19

3

unsigned是一個關鍵字。 unsigned只能用於積分類型。 unsignedsigned被認爲是一個類型說明符,一個簡單的類型說明符。所以他們指定該類型將通過簽名或未簽名。

可以typedef的話unsigned intuint但隨後這將使它看起來像一個類型時int是類型和unsigned是類型說明符本身。

您可以使用自己unsigned,流行的看法相反,如C++ ISO標準7.1.5.2節表7證實:

enter image description here

您可以使用多個類型說明符(時只允許),並且可以以任意順序與decl-specifiers自由混合。

你也可以這樣做:

int unsigned i; 

,這是合法的C++。

1

關鍵字signed,unsigned,short和long是類型修飾符/說明符,並且當其中一個類型修飾符/說明符本身被使用時,會假定爲int的數據類型。

所以有符號和無符號也可以是used as standalone type specifiers,分別與signed int和unsigned int相同。下面兩個聲明是等效的:

unsigned abc; 

unsigned int abc; 
5

主要問題已回答幾次:所述unsigned關鍵字僅能用作類型說明符爲一個整數類型。

至於爲什麼unsigned是一個單獨的關鍵字,而不是具有uint關鍵字,其原因是歷史的。

C的最早版本(預-K & R)只有四個基本類型:

  • char(8比特,簽名,二進制補碼)
  • int(16比特,符號,2的-complement)
  • float(32位)
  • double(64比特,相同的範圍內float但更大的精度)

注意缺少了什麼:沒有signedunsigned關鍵字,沒有shortlong,或long double;所有這些都是後來添加的。 (需要無符號算術的程序員常用指針,可與int自由互換。)

每個基本類型的名稱都是單個關鍵字,這使得語法變得非常簡單。

當其他類型的後來補充說,這是有意義的像unsignedshort,並long添加符到現有的類型名稱,而不是引入新的關鍵字(這可能會打破現有的代碼)。當ANSI C委員會在1989年對語言進行標準化時,他們必須在現有的不太正式的定義之外製定一個連貫的結構,同時保持與現有的實施一致。結果是我們現在擁有的,其中int long unsigned long是一個有效的類型名稱(更常見地寫爲unsigned long long)。

如果語言是從頭開始設計的,我懷疑會採取不同的方法。也許每種基本類型都會有一個關鍵字(例如C#採用的方法),或者基本類型名稱可能會使用更一致的方案,而不是混雜的關鍵字(例如,int:2爲2個字節整數,unsigned:4爲一個4字節的無符號整數)。但是C和C++都堅持使用當前的方法。

參考:http://cm.bell-labs.com/cm/cs/who/dmr/cman.pdf

0

還有無符號的字符。一些編譯器,比如GNU的g ++,可以讓你把無符號和假設你的意思是unsigned int。例如下面的代碼是等效的

unsigned int x; 

unsigned x; 
相關問題