2013-05-15 61 views
1

我在一些C++代碼看到以下形式關鍵字 「無符號」:的 「無符號」 關鍵字

const int HASH_MASK = unsigned(-1) >> 1; 

後來:

unsigned hash = HASH_SEED; 

(它是從CS106B/X截取讀者 - 斯坦福大學 - 由Eric S. Roberts撰寫 - 關於「爲字符串實現散列碼功能」的主題)。

有人可以告訴我請問那個關鍵字是什麼意思,什麼時候我用它呢?

謝謝!

+0

這裏已經回答: http://stackoverflow.com/questions/621290/what-is-the-difference-between-signed-and-unsigned-variables –

+0

'const int的HASH_MASK = MAX_INT;'似乎像是對我更好的賭注。或者我猜可能'std :: numeric_limits :: max()'在C++中? –

回答

0

這是一個簡短版本的unsigned int。在語法上,您可以在任何使用任何其他數據類型(如floatshort)的地方使用它。

0

無符號類型是不能表示負數的類型;只有零和正數。在C++中,他們使用模塊化算術; N位型的模數爲2^N。因爲C++允許對負數進行幾種不同的表示,這可能會導致可移植性問題,所以在亂碼模式(例如計算哈希碼時)使用無符號而非帶符號的類型是一個好主意。

unsigned可用作任何整數類型的限定符(例如unsigned intunsigned long long);或者作爲unsigned int的簡寫。

所以第一個將-1轉換爲unsigned int。由於模塊化算術,這給出了最大的可表示值。這也可以寫成(更明確,在我看來)爲std::numeric_limits<unsigned>::max()

第二個聲明並初始化unsigned int類型的變量。

0

默認值爲符號,表示它們可以是正數也可以是負數。 unsigned關鍵字用於指定值必須是正值。

帶符號變量使用1位來指定值是否爲正值。 unsigned關鍵字actualy使這個位成爲該值的一部分(從而允許存儲更大的數字)。

最後,編譯器將unsigned hash解釋爲unsigned int hash(int是C編程中的默認類型)。

+0

這是非常有益的,謝謝 –

0

爲了得到一個好主意什麼unsigned的意思是,必須理解有符號和無符號整數。有關二進制補語的完整說明,請搜索維基百科,但簡而言之,計算機通過從2^32(對於32位整數)減去負數來存儲負數。以這種方式,-1被存儲爲2^32-1。這確實意味着你只有2^31個正數,但這是由。這就是所謂的帶符號整數(因爲它可以有正號或負號)

無符號告訴編譯器,你不想要兩個讚美,只處理正數。當-1被強制轉換(因爲它是在代碼)到無符號整型變得

2^32-1 = 0b111111111... 

因此即得到一大堆的1的二進制的一個簡單的方法。

很少使用無符號。如果您需要進行位操作,或者由於某種原因,只需要大於2^31的正整數。否則,如果你不發表它,C++會採用有符號整數。

+0

這是非常有益的,謝謝 –

0

C允許char s是有符號或無符號的,這取決於哪一個對主機更有效。如果你想確保你的char是無符號的,你可以聲明你的變量爲unsigned char。如果您希望確保簽名解釋,您可以使用signed char

順便提及,C和C++編譯器treatd charsigned char,和作爲unsigned char三種不同類型的,即使char被編譯到其它兩個中的一個。