-
無符號數和有符號數
-
在計算機中參與運算的數有兩大類:無符號數和有符號數。
-
計算機中的數均存放在寄存器中,通常稱寄存器的位數為機器字長。所謂無符號數,即沒有符號的數,在寄存器中的每一位均可用來存放數值。當存放有符號數時,則需留出位置存放符號。因此,在機器字長相同時,無符號數與有符號數所對應的數值范圍是不同的。
-
對有符號數而言,符號的“正”、“負”機器是無法識別的,但由於“正”、“負”恰好是兩種截然不同的狀態,如果用“0”表示“正”,用“1”表示“負”,這樣符號也被數字化了,並且規定將它放在有效數字的前面,即組成了有符號數。
-
把符號“數字化”的數稱為機器數,而把帶“+”或“-”符號的數稱為真值。一旦符號數字化后,符號和數值就形成了一種新的編碼。在運算過程中,符號位能否和數值部分一起參加運算?如果參加運算,符號位又需作哪些處理?這些問題都與符號位和數值位所構成的編碼有關,這些編碼就是原碼、補碼、反碼和移碼。在這些編碼中,補碼的應用居多,原因是補碼可以帶符號運算,而且可以變減為加。
-
-
原碼、反碼、補碼、移碼表示法
-
原碼:原碼就是符號位加上真值的絕對值,即用第一位表示符號,其余位表示值。
-
反碼:反碼有兩種情況:
當原碼為正數時,其反碼就等於正數的原碼。
當原碼為負數時,其反碼就等於正數的原碼按位取反,但是最高位的符號位不變。
-
補碼:補碼有兩種情況:
當原碼為正數時,其補碼就等於正數的原碼。
當原碼為負數時,其補碼就等於正數的原碼按位取反,符號位不變,最后再在末尾加1(即在反碼的末尾加1)。
-
移碼:移碼(又叫增碼),是符號位取反的補碼。
總結:
-
正數的原碼,補碼,反碼相同。
-
負數的反碼:原碼的數值取反。
-
負數的補碼:原碼轉換成反碼,反碼末位加1。
-
負數的移碼:與補碼的符號位(第一位數字)相反。
-
-
移位運算
-
算數移位規則
-
機器數為正時,不論是左移還是右移,添補代碼均為0。
-
由於負數的原碼數值部分與真值相同,故在移位時只要使符號位不變,其空位均添0。
-
由於負數的反碼各位除符號位外與負數的原碼正好相反,故移位后所添的代碼應與原碼相反,即全部添1。
-
分析任意負數的補碼可發現,當對其由低位向高位找到第一個“1”時,在此“1”左邊的各位均與對應的反碼相同,而在此“1”右邊的各位(包括此“1”在內)均與對應的原碼相同。故負數的補碼左移時,因空位出現在低位,則添補的代碼與原碼相同,即添0;右移時因空位出現在高位,則添補的代碼應與反碼相同,即添1。
-
-
邏輯移位規則
- 邏輯左移時,高位移丟,低位添0。
- 邏輯右移時,低位移丟,高位添0。
-
加法和減法運算
加減法運算是計算機中最基本的運算,因減法運算可看做被減數加上一個減數的負值,即A-B=A+(-B),故在此將機器中的減法運算和加法運算合在一起討論。現代計算機中都采用補碼作加減法運算。
-
溢出判斷
在計算機中,超出機器字長的現象叫溢出。
補碼定點加減運算判斷溢出有兩種方法:
-
用一位符號位判斷溢出
-
對於加法,只有在正數加正數和負數加負數兩種情況下才可能出現溢出,符號不同的兩個數相加是不會溢出的。
-
對於減法,只有在正數減負數或負數減正數兩種情況下才可能出現溢出,符號相同的兩個數相減是不會溢出的。
-
-
用兩位符號位判斷溢出
- 在用變形補碼作加法時,2位符號位要連同數值部分一起參加運算,而且高位符號位產生的進位自動丟失,便可得正確結果。
- 變形補碼判斷溢出的原則是:當2位符號位不同時,表示溢出,否則,無溢出。不論是否發生溢出,高位(第1位)符號位永遠代表真正的符號。
-
-
參考:
https://blog.csdn.net/cbwem/article/details/79683265