補碼與算術右移指令

2021-05-27 21:26:59 字數 1570 閱讀 3904

補碼與算術右移指令

補碼雜談

補碼的優越性,使得用最高位作符號的原碼顯得多餘。正數的補碼是它本身,負數的補碼通過對其絕對值進行求補獲得。求補運算是將數值按位取反,再加一。不要與補碼的概念混淆。它具有許多的優良的特性。

求補過程與反求補過程為同一過程,也就是說,對乙個數求補兩次後,還是這個數本身。通過補碼的物理意義這是很好理解的。也可以分析求補的運算過程來說明。對某數按位取反後,加上1,這時開始從最低位向高位進製,直到某個高位上為零,無法向更高位進製為止(當然有個極端的情況的就是對0求補,而0的求補結果為其本身,大可拋開它不談)。產生的效果是最低的若干位被取反,且這若干位的形式應該為1加上若干個0(當然可以是0個)。這些被加1影響的若干位就相當於被取反了兩次,也就是說得到的是它們原來的樣子。而未被加1影響的部分則被取反了一次。再進行一次求補運算,看看會出現什麼結果。先取反,這樣未被加1影響的部分就進行了兩次取反而恢復了原貌。而被加1影響部分取反後得到的形式為乙個0帶上若干個1(可以為0個1),這樣的形式在加上1後會被全部取反,而不影響別的部分。這樣這部分又恢復了原貌。所以整個數又恢復了原貌。

用補碼進行加法運算的時候,易於判斷結算是不是溢位。判斷的方法是計算次高位與最高位向其高位的進製的異或,結果若為0則表示正常,否則表示溢位。溢位的情形無非兩種,分別為兩正數與兩負數相加的時候。兩正數相加是次高位進製時,顯然是溢位的情形,而這時最高位為0,無法再進製,這樣進製異或結果為1,反映溢位;兩負數相加時,最高位肯定有進製。這樣,只有次高位無法進製時,才使異或結果為1。而這時,表示的就是溢位。可以把負數的絕對值看成油罐中的油,其補碼除最高位後的部分可以看成油罐中的剩餘空間。當兩罐油倒成一桶進,如果剩下的空間沒有夠一罐,那麼油一定溢位了。

算術右移指令

算術右移指令sar(shift arithmetic right)的操作是,將暫存器中的數值右移,最左端用最高位填充,而不是補零。這裡分析它為什麼不直接補零的原因。為方便討論,考慮右移一位的情況。右移若干位的情況,也可做相似的分析。

不直接補零的根本原因是為了不改變量值的符號並且使得數值是原來的一半。眾所周知,符號數是以補碼的形式儲存在計算機內的。正數的補碼是其本身,最高位為0。 右移1位時,最高位補零,其值縮小一半。這沒有什麼問題。對於負數,其補碼為對其絕對值求補後獲得。最高位補1,也相當於次高位補1,能達到縮小一半的效果嗎?那要看右移後對應的原碼是否為原來的一半了。也就是,在最高位與次高位是不是0。要檢視原碼,只需對結果求一次補就行了。求補第一步是取反,這樣填充的1就成了0,沒有出現問題,但還得看第二步加1。哪些情況下加上1可能會影響次高位呢?答案只有兩個數。當原來的補碼除最高位與最低位都是0的時候,右移一位後除最高位外都是0,在求補進取反後這些0變成了1,加1後,進製會影響到次高位,使之變成1(經取反後,次高位被置成了0),而原碼的次高位應該填充0的,這樣就沒有達到縮小原數的效果。以4位數為例,這樣的數為:1000,1001。1000如果要計算機看成符號數的話,會被看成-16!而其它數,因為中間部分有1,取反後變成了0,加1後的進製不能影響到次高位,所有可以達到縮小原數且不改變符號的效果。

計算機求補的情形不多,一是指令中的數含有負號的時候,但如果指令中出現負0,也就是『-0』彙編器會把它變成0。二是作減法運算的時候。

補碼與算術右移指令

補碼與算術右移指令 補碼雜談 補碼的優越性,使得用最高位作符號的原碼顯得多餘。正數的補碼是它本身,負數的補碼通過對其絕對值進行求補獲得。求補運算是將數值按位取反,再加一。不要與補碼的概念混淆。它具有許多的優良的特性。求補過程與反求補過程為同一過程,也就是說,對乙個數求補兩次後,還是這個數本身。通過補...

邏輯右移和算術右移

問題描述 在寫嵌入式的程式中,常會將資料定義為unsigned int,這樣定義有什麼好處呢?下面從邏輯右移和算術右移的角度進行分析。分析 1 邏輯右移和算術右移 邏輯右移,移走的位填充為0 算術右移,移走的位填充與符號位有關,例如如果為負數,則移走的位填充為1。2 unsigned int 和 i...

邏輯右移和算術右移

先做兩個小題先。1 unsigned char x 3 x 1是多少?x 1是多少?2 char x 3 x 1是多少?x 1是多少?3 char x 3 x 1是多少?x 1是多少?3寫成二進位制數是00000011 3寫成二進位制數是 補碼 11111101。程式執行的時候,操作的是數值的編碼表...