2014-01-14 72 views
2

我正確地將無符號整數移動32,但它根本不影響數字,爲什麼會發生?右移不能正常工作

int main() 
{ 
    unsigned int rnd=2347483648; 
    cout<<rnd; 
    rnd=rnd>>32; 
    cout<<endl<<rnd; 
} 

當代碼運行時,它顯示rnd兩次,根本沒有任何影響。我相信在右移32位int之後,它不應該顯示爲零嗎?

+1

得愛這些「核心語言功能X不工作」的問題......你不能只是多加註意你正在閱讀的書/教程嗎? – 2014-01-14 13:10:34

+0

呃rnd = rnd >> 32顯示了同樣的結果,我也試過了......但它應該顯示0對嗎? – Ahmed

+0

現在再次看到問題,這是其實的問題.. – Ahmed

回答

9

你缺少一個賦值操作符 - 的>>移位運算符不執行「就地」操作:

rnd = rnd >> 32; 

你可以也可以使用複合移位運算符,該運算符應用移位運算並將結果返回給變量:

rnd >>= 32; 

然而,在這兩種情況下,在未定義的行爲此代碼的結果,請參閱Shifting a 32 bit integer by 32 bits

如果右操作數的值是負的或大於或等於所宣傳的寬度左操作數,行爲是未定義的。

因此,您可以從該操作中獲得任何結果。

+1

請注意,也有複合移位運算符,'a << = b'和'a >> = b' – SBI

+0

@SBI好點 - 可能會計爲「in-place」:) –

+0

現在看到問題...這就是我的意思....移動32應該導致0,但爲什麼它沒有發生? – Ahmed

3

位移運算符不會修改原始數據。它只是返回一個修改後的副本。

我覺得這是你的意思辦:

rnd = rnd >> 32; 

假設大小的unsigned int是32位,雖然,這不是一個真正的有用操做。

+0

它也試過,但結果是一樣的 – Ahmed

+0

您可能會發現,以較小的數量轉移將起作用。超出數據類型的範圍可能會導致未定義的行爲。在某些構建/編譯器上,它可能會將變量歸零,在其他變量中可能會填充垃圾數據,或者完全不做任何操作。基本上,不要這樣做。 :) –

+0

我不明白爲什麼倒票,它基本上是一個重要的問題,爲什麼它不顯示零,因爲我實現通用哈希,我需要它爲我的哈希函數返回0(這是非常合乎邏輯)索引散列表 – Ahmed

4

在推廣操作類型位,或更多數量轉移,給不確定的行爲。 unsigned int通常爲32位,因此,在移動32位或更多位時,通常會應用此處的操作。

這是因爲當移位溢出時,不同處理器的行爲不同,語言設計者不希望通過指定特定行爲來阻止實現使用處理器的內置移位指令。