原码一位乘法器设计_对原码、反码和补码的加深理解
生活随笔
收集整理的這篇文章主要介紹了
原码一位乘法器设计_对原码、反码和补码的加深理解
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
我們知道計算機語言可以簡單概括為三類,分別是機器語言、匯編語言和高級語言。機器語言是由二進制組成的編碼,由無數個0和1組成。在二進制系統中,每個0或1就是一個位,而位是數據存儲的最小單位,可稱之為比特(Bit)。在計算機高級語言(Java)中,整數類型變量中有字節型(byte),它與比特的換算關系為1byte=8bit,也就是1個字節等于8個比特。8個比特在二進制編碼中的表現形式(以數1為例)是這樣的:0000?0001轉換為十進制數就是2^0=1而在一般情況下它能表示的最大范圍數為1111 1111最小范圍數為0000 0000最大范圍數轉換為十進制數也就是2^8-1=255,最小范圍數為0,范圍為0~255。而實際字節型(byte)的取值范圍卻為-2^7~2^7-1即-128~127,這是為什么呢?現代數學中數字有大小和正負之分,可以進行算術運算(加減乘除),然而對于計算機來說,數字都是以無符號位的二進制數表示,它既分不清大小,也分不清正負。為了解決這個問題,就引入了原碼、反碼、補碼這個概念。我們先看原碼的定義:原碼(true form)是一種計算機中對數字的二進制定點表示方法。原碼表示法在數值前面增加了一位符號位(即最高位為符號位):正數該位為0,負數該位為1(0有兩種表示:+0和-0),其余位表示數值的大小。——百度百科計算機中所有的數均用0、1編碼表示,數字的正負號也不例外,如果一個機器數字長是n位的話,約定最左邊一位用作符號位,其余n-1位用于表示數值。——維基百科對于字節型來說,符號位(從右向左最后一位)決定正負而不參與數值運算,在原碼中,0000 0000代表十進制數0,1000 0000代表十進制數-0,而0000 0001代表十進制數1,1000?0001代表十進制數-1,我們可以觀察到他們的異同:相同之處:對于±0和±1,最高位(符號位)都決定了它們的正負情況。不同之處:對于+0和-0來說,現實中運算并沒有正負之分,也就是它們應該是相等的。一個字節共8位,其中7位表示數,一位代表符號,這樣的結果就是0000 0000和1000 0000都可以表示為0。在最初是通過CPU執行兩次比較來識別±0的,但是這種方式不僅增加了成本,也給電路的設計帶來了挑戰,最終經由補碼來解決這個問題。原碼的優點在于簡單直觀的反映了一個數的大小正負情況,然而它卻不能直接參與減法運算。以1-1為例,計算機中減法運算可以理解為正數+負數,故1-1在計算機實際運算中等于1+(-1),也就是0000 0001+1000?0001=1000 0010十進制數為-2,可知原碼直接參與負數運算是不被允許的反碼就是用來解決原碼運算問題的過渡碼:反碼的概念:反碼通常是用來由原碼求補碼或者由補碼求原碼的過渡碼。根據定義,可以得到機器數的反碼的整數和小數中“0”的表示形式各有2種,“+0”和“-0”不一樣,以8位機器數為例,整數的“+0”原碼為0,0000000,反碼為0,0000000;整數的“-0”原碼為1,0000000,反碼為1,1111111;小數的“+0”原碼為0.0000000,反碼為0.0000000;小數的“-0”原碼為1.0000000,小數的“-0”反碼為1.1111111。反碼跟原碼是正數時,一樣;負數時,反碼就是原碼符號位除外,其他位按位取反。[1]——百度百科可知對于正數來說,反碼=原碼,對于負數來說,反碼=符號位不變,其它位按位取反我們看看反碼在二進制的運算情況以1-1為例1的原碼0000 0001
1的反碼0000 0001-1的原碼1000 0001
-1的反碼1111 1110也就是0000 0001+1111?1110=1111?11111111 1111轉換為原碼得1000?0000,十進制也就是-0以1-2為例1的原碼0000 0001
1的反碼0000 0001-2的二進制;-2的原碼1000 0010
-2的反碼1111 1101也就是0000 0001+1111 1101=1111 11101111 1110轉換為原碼得1000 0001 ,十進制也就是-1以2-1為例2的原碼0000 0010
2的反碼0000 0010-1的原碼1000 0001
-1的反碼1111 1110也就是0000 0010+1111 1110=1?0000 0000實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,即為0000 0000,原碼0000 0000,十進制為0以-1-1為例-1的原碼1000 0001
-1的反碼1111 1110也就是1111 1110+1111 1110=1?1111?1100實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,即為1111?1100,原碼為1000 0011十進制為-3,同理-1-2結果為-4由上面的例子可以發現些許問題,反碼計算中,某些情況下(如2-1)實際正確值=實際結果值-1,如果結果為±0,那么+0和-0的區分也存在問題,如果正數+負數<0結果正確,反碼無疑也是行不通的,由此便引入了補碼的概念(注意:補碼的運算中最高位是參與運算的,相當于無符號位運算)。在介紹補碼概念之前,先介紹一下“模”的概念:“模”是指一個計量系統的計數范圍,如過去計量糧食用的斗、時鐘等。計算機也可以看成一個計量機器,因為計算機的字長是定長的,即存儲和處理的位數是有限的,因此它也有一個計量范圍,即都存在一個“模”。如:時鐘的計量范圍是0~11,模=12。表示n位的計算機計量范圍是0-2^n-1,模=2^n.“模”實質上是計量器產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數。任何有模的計量器,均可化減法為加法運算?[3]??。假設當前時針指向8點,而準確時間是6點,調整時間可有以下兩種撥法:一種是倒撥2小時,即8-2=6;另一種是順撥10小時,8+10=12+6=6,即8-2=8+10=8+(12-2)(mod 12).在12為模的系統里,加10和減2效果是一樣的,因此凡是減2運算,都可以用加10來代替。若用一般公式可表示為:a-b=a-b+mod=a+(mod-b)。對“模”而言,2和10互為補數。實際上,以12為模的系統中,11和1,8和4,9和3,7和5,6和6都有這個特性,共同的特點是兩者相加等于模。對于計算機,其概念和方法完全一樣。n位計算機,設n=8,所能表示的最大數是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丟失。又回到了?00000000,所以8位二進制系統的模為2^8。在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以了。把補數用到計算機對數的處理上,就是補碼?[3]??。——摘自百度百科概念中巧妙的用到了時鐘來舉例,假設當前時間為8點,要調到6點,有兩種辦法:一種是往回調撥2小時(逆時針),即8-2=6;另一種是往后順撥10小時(順時針),即8+10=6。這里用到了同余的概念,而不是簡單地相加減。我們知道時鐘從1到12類似首尾相連,銜接成一個圓,12點過后會回轉到1點,而不會向上疊加為13、14等,12就是時鐘的模。我們發現期望結果=8-2=8+(模=12-2)=8+10。這里也可以以東南西北方位為例,假設指針所指為北邊,要轉到為西邊,可以逆時針轉90°,也可以順時針轉270°(360°-90°),360°就是方位的模。北西? ? ↑? ? 東南8位的計算機每位的變化量為2,要么為0要么為1,所以總共能表示的數據有2^8=256個,無符號值的范圍為0000 0000~1111 1111,也就是0~2^8-1即0~255,256即為字節型的模(這點有疑惑的可參照數組的特點,相當于索引從0~255,但實際長度為索引最大值255+1)。如果數值大于255如1 0000 0000(十進制為2^8=256)則最高位1丟失,最終變成0000 0000,相當于時鐘走過12點又回到1點。故計算機8位的模256=1111 1111+0000 0001(數1)=最高位數值+1。推導過程:這里的運算相當于無符號運算以8-2為例,同理,8-2=8+(-2)=8+(計算機8位的模-2)計算機8位的模-2=1111?1111+0000?0001(數1)-0000?0010(數2)??????????? =1111?1111-0000?0010(數2)+0000?0001(數1)??????????????而1111 1111- 0000 0010(數2)=1111 1101=數(-2)的反碼0000 0001(數1)+1111 1101=1+數(-2)的反碼=數(-2)的補碼故計算機8位的模-2=數(-2)的補碼所以8-2=8+(計算機8位的模-2)=8+數(-2)的補碼8的二進制:原碼0000 1000
反碼0000 1000補碼0000?1000-2的二進制:原碼1000 0010
反碼1111 1101補碼1111?1110故8-2=8+(-2)=0000 1000+1111 1110=1??0000 0110實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,即為0000?0110,化為十進制數為2^2+2^1=6由上面的推導公式可以發現規律:計算機8位的模=最高位(1111 1111)+1a-b=a+(計算機8位的模-b)計算機8位的模-b=最高位-b+1最高位-b=-b的反碼-b的反碼+1=-b的補碼a-b=a+(-b)的補碼可知對于正數來說,補碼=反碼=原碼;對于負數來說,反碼=原碼符號位不變,其它位按位取反,補碼=反碼+1以以下幾個例子來做測試:1-2=1+(-2)1的二進制:原碼0000 0001
反碼0000 0001補碼0000 0001-2的二進制:原碼1000 0010
反碼1111 1101補碼1111?1110故1-2=1+(-2)=0000 0001+1111 1110=1111 1111減1,轉換為反碼1111 1110,轉換為原碼1000?0001,十進制為-12-1=2+(-1)2的二進制:原碼0000 0010
反碼0000 0010補碼0000 0010-1的二進制:原碼1000 0001反碼1111 1110補碼1111 1111故2-1=2+(-1)=0000 0010+1111 1111=1?0000?0001實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,0000 0001由符號位可知為正數,其原碼、反碼、補碼相等,將0000 0001轉換為十進制數為1*2^0=11-1=1+(-1)1的二進制:原碼0000 0001
反碼0000 0001補碼0000 0001正數的原碼、反碼、補碼是一致的-1的二進制:原碼1000 0001反碼1111 1110補碼1111 1111負數的反碼為原碼符號位不變,其它位取反負數的補碼為反碼+1故1-1=1+(-1)=0000 0001+1111 1111=1 0000 0000實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,0000 0000的原碼、反碼、補碼都是0解答:可知1個字節占8位,能表示的數據有2^8=256個。二進制數范圍為0000 0000~1111 1111即0~255,把它當作無符號數劃分開來,可區分為0000 0000~0111 1111(0~127)和1000 0000~1111 1111(128~255),分別對應正負數。正數分到的區間為0000 0000~0111 1111,負數分到的區間為1000 0000~1111 1111。已知補碼相當于無符號數,對正數而言,原碼=反碼=補碼,故字節型正數原碼范圍0000 0000~0111 1111一一對應0000 0000~0111 1111(0~127),即原碼1(0000 0001)對應補碼0000 0001(無符號數值1),原碼127(0111 1111)對應補碼0111 1111(127),共有128個數據;對負數而言,補碼=原碼取反+1,以原碼-1為例,原碼-1(1000 0001)對應的補碼為1111 1111(無符號數值255),原碼-2(1000 0001)對應的補碼為1111?1110(無符號數值254)……原碼-127(1111 1111)對應的補碼為1000 0001(無符號數值129),剩下最后一個,原碼-0(1000 0000)對應的補碼為1000 0000(無符號數值128),可知0~255區間每個數都是獨立不重復的,如果按照實際取值,-0對應無符號數值128,而規定的0的二進制數為0000 0000對應補碼0000 0000(無符號數值0),“一山不容二虎”,為了保持獨立性,規避±0區分問題,計算機中直接硬性規定1000 0000原碼的實際值為-128,對應的補碼為1000 0000(無符號數值128),所以負數的取值范圍為-128~-1,有128個數據。所以字節型(byte)的取值范圍為(-128~-1)∪(0~127)為-2^7~2^7-1即-128~127。補充:2^0+2^1+……2^n=(2^n)-12進制數轉換為10進制數如0111 1111=2^6+2^5+2^4+2^3+2^2+2^1+2^0=2^7-1=127除原碼、反碼、補碼外還有移碼移碼(又叫增碼)是符號位取反的補碼,一般用指數的移碼減去1來做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。——百度百科若0111 1111為補碼,則移碼為1111 1111以下是給我以啟迪的鏈接,在此表示特別感謝https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.htmlhttps://blog.csdn.net/wenxinwukui234/article/details/42119265https://blog.csdn.net/u011080472/article/details/51280919https://blog.csdn.net/wn084/article/details/79963979https://blog.csdn.net/sixu_9days/article/details/79227131https://blog.csdn.net/big_big_white/article/details/79444651
1的反碼0000 0001-1的原碼1000 0001
-1的反碼1111 1110也就是0000 0001+1111?1110=1111?11111111 1111轉換為原碼得1000?0000,十進制也就是-0以1-2為例1的原碼0000 0001
1的反碼0000 0001-2的二進制;-2的原碼1000 0010
-2的反碼1111 1101也就是0000 0001+1111 1101=1111 11101111 1110轉換為原碼得1000 0001 ,十進制也就是-1以2-1為例2的原碼0000 0010
2的反碼0000 0010-1的原碼1000 0001
-1的反碼1111 1110也就是0000 0010+1111 1110=1?0000 0000實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,即為0000 0000,原碼0000 0000,十進制為0以-1-1為例-1的原碼1000 0001
-1的反碼1111 1110也就是1111 1110+1111 1110=1?1111?1100實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,即為1111?1100,原碼為1000 0011十進制為-3,同理-1-2結果為-4由上面的例子可以發現些許問題,反碼計算中,某些情況下(如2-1)實際正確值=實際結果值-1,如果結果為±0,那么+0和-0的區分也存在問題,如果正數+負數<0結果正確,反碼無疑也是行不通的,由此便引入了補碼的概念(注意:補碼的運算中最高位是參與運算的,相當于無符號位運算)。在介紹補碼概念之前,先介紹一下“模”的概念:“模”是指一個計量系統的計數范圍,如過去計量糧食用的斗、時鐘等。計算機也可以看成一個計量機器,因為計算機的字長是定長的,即存儲和處理的位數是有限的,因此它也有一個計量范圍,即都存在一個“模”。如:時鐘的計量范圍是0~11,模=12。表示n位的計算機計量范圍是0-2^n-1,模=2^n.“模”實質上是計量器產生“溢出”的量,它的值在計量器上表示不出來,計量器上只能表示出模的余數。任何有模的計量器,均可化減法為加法運算?[3]??。假設當前時針指向8點,而準確時間是6點,調整時間可有以下兩種撥法:一種是倒撥2小時,即8-2=6;另一種是順撥10小時,8+10=12+6=6,即8-2=8+10=8+(12-2)(mod 12).在12為模的系統里,加10和減2效果是一樣的,因此凡是減2運算,都可以用加10來代替。若用一般公式可表示為:a-b=a-b+mod=a+(mod-b)。對“模”而言,2和10互為補數。實際上,以12為模的系統中,11和1,8和4,9和3,7和5,6和6都有這個特性,共同的特點是兩者相加等于模。對于計算機,其概念和方法完全一樣。n位計算機,設n=8,所能表示的最大數是11111111,若再加1成100000000(9位),但因只有8位,最高位1自然丟失。又回到了?00000000,所以8位二進制系統的模為2^8。在這樣的系統中減法問題也可以化成加法問題,只需把減數用相應的補數表示就可以了。把補數用到計算機對數的處理上,就是補碼?[3]??。——摘自百度百科概念中巧妙的用到了時鐘來舉例,假設當前時間為8點,要調到6點,有兩種辦法:一種是往回調撥2小時(逆時針),即8-2=6;另一種是往后順撥10小時(順時針),即8+10=6。這里用到了同余的概念,而不是簡單地相加減。我們知道時鐘從1到12類似首尾相連,銜接成一個圓,12點過后會回轉到1點,而不會向上疊加為13、14等,12就是時鐘的模。我們發現期望結果=8-2=8+(模=12-2)=8+10。這里也可以以東南西北方位為例,假設指針所指為北邊,要轉到為西邊,可以逆時針轉90°,也可以順時針轉270°(360°-90°),360°就是方位的模。北西? ? ↑? ? 東南8位的計算機每位的變化量為2,要么為0要么為1,所以總共能表示的數據有2^8=256個,無符號值的范圍為0000 0000~1111 1111,也就是0~2^8-1即0~255,256即為字節型的模(這點有疑惑的可參照數組的特點,相當于索引從0~255,但實際長度為索引最大值255+1)。如果數值大于255如1 0000 0000(十進制為2^8=256)則最高位1丟失,最終變成0000 0000,相當于時鐘走過12點又回到1點。故計算機8位的模256=1111 1111+0000 0001(數1)=最高位數值+1。推導過程:這里的運算相當于無符號運算以8-2為例,同理,8-2=8+(-2)=8+(計算機8位的模-2)計算機8位的模-2=1111?1111+0000?0001(數1)-0000?0010(數2)??????????? =1111?1111-0000?0010(數2)+0000?0001(數1)??????????????而1111 1111- 0000 0010(數2)=1111 1101=數(-2)的反碼0000 0001(數1)+1111 1101=1+數(-2)的反碼=數(-2)的補碼故計算機8位的模-2=數(-2)的補碼所以8-2=8+(計算機8位的模-2)=8+數(-2)的補碼8的二進制:原碼0000 1000
反碼0000 1000補碼0000?1000-2的二進制:原碼1000 0010
反碼1111 1101補碼1111?1110故8-2=8+(-2)=0000 1000+1111 1110=1??0000 0110實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,即為0000?0110,化為十進制數為2^2+2^1=6由上面的推導公式可以發現規律:計算機8位的模=最高位(1111 1111)+1a-b=a+(計算機8位的模-b)計算機8位的模-b=最高位-b+1最高位-b=-b的反碼-b的反碼+1=-b的補碼a-b=a+(-b)的補碼可知對于正數來說,補碼=反碼=原碼;對于負數來說,反碼=原碼符號位不變,其它位按位取反,補碼=反碼+1以以下幾個例子來做測試:1-2=1+(-2)1的二進制:原碼0000 0001
反碼0000 0001補碼0000 0001-2的二進制:原碼1000 0010
反碼1111 1101補碼1111?1110故1-2=1+(-2)=0000 0001+1111 1110=1111 1111減1,轉換為反碼1111 1110,轉換為原碼1000?0001,十進制為-12-1=2+(-1)2的二進制:原碼0000 0010
反碼0000 0010補碼0000 0010-1的二進制:原碼1000 0001反碼1111 1110補碼1111 1111故2-1=2+(-1)=0000 0010+1111 1111=1?0000?0001實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,0000 0001由符號位可知為正數,其原碼、反碼、補碼相等,將0000 0001轉換為十進制數為1*2^0=11-1=1+(-1)1的二進制:原碼0000 0001
反碼0000 0001補碼0000 0001正數的原碼、反碼、補碼是一致的-1的二進制:原碼1000 0001反碼1111 1110補碼1111 1111負數的反碼為原碼符號位不變,其它位取反負數的補碼為反碼+1故1-1=1+(-1)=0000 0001+1111 1111=1 0000 0000實際位數為8,這里有9位,所以最高位1溢出被自動舍棄,0000 0000的原碼、反碼、補碼都是0解答:可知1個字節占8位,能表示的數據有2^8=256個。二進制數范圍為0000 0000~1111 1111即0~255,把它當作無符號數劃分開來,可區分為0000 0000~0111 1111(0~127)和1000 0000~1111 1111(128~255),分別對應正負數。正數分到的區間為0000 0000~0111 1111,負數分到的區間為1000 0000~1111 1111。已知補碼相當于無符號數,對正數而言,原碼=反碼=補碼,故字節型正數原碼范圍0000 0000~0111 1111一一對應0000 0000~0111 1111(0~127),即原碼1(0000 0001)對應補碼0000 0001(無符號數值1),原碼127(0111 1111)對應補碼0111 1111(127),共有128個數據;對負數而言,補碼=原碼取反+1,以原碼-1為例,原碼-1(1000 0001)對應的補碼為1111 1111(無符號數值255),原碼-2(1000 0001)對應的補碼為1111?1110(無符號數值254)……原碼-127(1111 1111)對應的補碼為1000 0001(無符號數值129),剩下最后一個,原碼-0(1000 0000)對應的補碼為1000 0000(無符號數值128),可知0~255區間每個數都是獨立不重復的,如果按照實際取值,-0對應無符號數值128,而規定的0的二進制數為0000 0000對應補碼0000 0000(無符號數值0),“一山不容二虎”,為了保持獨立性,規避±0區分問題,計算機中直接硬性規定1000 0000原碼的實際值為-128,對應的補碼為1000 0000(無符號數值128),所以負數的取值范圍為-128~-1,有128個數據。所以字節型(byte)的取值范圍為(-128~-1)∪(0~127)為-2^7~2^7-1即-128~127。補充:2^0+2^1+……2^n=(2^n)-12進制數轉換為10進制數如0111 1111=2^6+2^5+2^4+2^3+2^2+2^1+2^0=2^7-1=127除原碼、反碼、補碼外還有移碼移碼(又叫增碼)是符號位取反的補碼,一般用指數的移碼減去1來做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。——百度百科若0111 1111為補碼,則移碼為1111 1111以下是給我以啟迪的鏈接,在此表示特別感謝https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.htmlhttps://blog.csdn.net/wenxinwukui234/article/details/42119265https://blog.csdn.net/u011080472/article/details/51280919https://blog.csdn.net/wn084/article/details/79963979https://blog.csdn.net/sixu_9days/article/details/79227131https://blog.csdn.net/big_big_white/article/details/79444651
總結
以上是生活随笔為你收集整理的原码一位乘法器设计_对原码、反码和补码的加深理解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js变量后面加问号是什么_js没那么简单
- 下一篇: python开发环境spyder_spy