2014-04-29 40 views
1

我正在閱讀有關C中的移位運算符。有符號數的右移運算符

右移n位除以2提高爲n。移位有符號值可能會失敗,因爲對於負值,結果永遠不會超過-1:-5 >> 3-1,而不是0,如-5/8

我的問題是爲什麼轉換有符號值可能會失敗?

爲什麼-5 >> 3的值是-1而不是零?

請解釋一下。

+0

由於右移複製符號位。如果從負數開始,則以負數結束(二進制中的所有數字,即2的補數爲-1)。 – oakad

+0

@oakad例如-5對於一個字節表示爲1000 0101。如果我們爲我們1111 0000做右移。我們如何得到-1? – venkysmarty

+0

@venkysmarty -5在8位是11111011.右移3會給你11111111. http://en.wikipedia.org/wiki/Two%27s_complement – oakad

回答

0

它僅僅是實現定義:

從5.8移位運算符

的操作數應爲整體的或無作用域枚舉類型並且執行 積分促銷。結果的類型是 升級的左操作數。的行爲是不確定如果右操作數 是否定的,或者大於或等於在 促進的左操作數的位長度

[...]

如果E1有一個簽名的類型和負值,結果值是實現定義的。

+0

你似乎左右混淆了。相關報價是「如果E1 有簽名類型和負值,則結果值是實現定義的」(未定義)。 –

-1

使用帶符號整數進行移位是實現定義的,但是如果您使用的架構有算術移位,則可以非常可靠地使用它進行猜測。

這是因爲計算機中存儲了負數。它被稱爲二補。要切換一個二進制補碼的符號,你的NOT它的位和加1.例如,用一個8位整數00011010(26),首先你要NOT得到11100101,然後你加1並得到11100110(-26)。問題來自最重要的位被設置。如果當你移動它的時候把0放在左邊,這個數字就會變成正數,但是如果它放1,那麼可能的最小結果是11111111這就是-1。這就是算術轉換的工作方式,當你移動計算機時,會添加與最左邊相同的位。

所以要明確,這是什麼(使用8個整數,因爲它更容易和大小是任意的在這種情況下)發生的事情:11111011被轉移3向右(所以011消失),並以來最顯著位被設置爲3 1 s被插入在頂部,所以你得到11111111這是-1。

+0

這種情況是實現定義的,而不是未定義的。 –

+0

固定。感謝您的更正。 – Tyler