2014-03-04 62 views
0

在算術右移(ASR)期間,MSB被複制到左側,所以符號保持不變 - 這很清楚。然而,在算術左移(ASL)中,該符號在某些情況下可能會丟失,例如,如何防止符號丟失算術左移(ASL)

01001001 << 1 = 10010010 

原數明顯正因爲MSB是0,但轉移數量是否定的,因爲MSB是1。能否請您解釋一下這是爲什麼?

+0

您如何期望將數字148表示爲8位有符號整數? 「我有一個可以容納10磅岩石的袋子,現在有8磅岩石,我怎麼能把袋子裏的岩石的數量加倍而不破壞呢?」 –

+0

你讀過這個了嗎? http://en.wikipedia.org/wiki/Arithmetic_shift –

+0

@雷蒙德,這是一個錯字! – John

回答

0

與右移不同的是,與「邏輯左移」相比,並沒有真正的「算術左移」,只有一種左移,並丟棄了符號。

沒有什麼別的事情可以做,真的。那些左移改變符號的情況恰恰就是那些「真實結果」不能用你擁有的許多位來表達的情況。

0

對於二進制補碼二進制值,導致負值變爲正值的左移只是一個翻轉條件。操作的結果是溢出。使用較大的整數類型。如果你使用的是補碼錶示法,那麼先將它轉換成二進制補碼值,然後進行轉換並將其轉換回來。

+0

好的謝謝所有澄清和建議。所以我沒有理解它 – John

0

在「算術左移」中,使用有符號值(任何位值大小(8,16等)),這只是一個邏輯左移(乘以2),它會給你一個正確的除非MSB發生變化(1 => 0或0 => 1),否則爲溢出(/下溢)或錯誤(未定義結果)條件。

有/某些處理器的溢出或錯誤標誌將被設置供您測試,否則您必須以編程方式自己測試。

對於無符號值,任何時候在移位後設置進位位,都是溢出。 (小心任何左移指令,不要移入進位,只需放下MSB)