原码、反码、补码、移码及其运算
原碼:
如果機(jī)器字長(zhǎng)為n,那么一個(gè)數(shù)的原碼就是用一個(gè)n位的二進(jìn)制數(shù),其中最高位為符號(hào)位:正數(shù)為0,負(fù)數(shù)為1。剩下的n-1位表示概數(shù)的絕對(duì)值。
例如: X=+101011 , [X]原= 00101011 X=-101011 , [X]原= 10101011
位數(shù)不夠的用0補(bǔ)全。
PS:正數(shù)的原、反、補(bǔ)碼都一樣:0的原碼跟反碼都有兩個(gè),因?yàn)檫@里0被分為+0和-0。
反碼:
知道了什么是原碼,那反碼就更是張飛吃豆芽——小菜一碟了。知道了原碼,那么你只需要具備區(qū)分0跟1的能力就可以輕松求出反碼,為什么呢?因?yàn)榉创a就是在原碼的基礎(chǔ)上,符號(hào)位不變其他位按位取反(就是0變1,1變0)就可以了。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100
補(bǔ)碼:
補(bǔ)碼也非常的簡(jiǎn)單就是在反碼的基礎(chǔ)上按照正常的加法運(yùn)算加1。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]補(bǔ)=11010101
PS:0的補(bǔ)碼是唯一的,如果機(jī)器字長(zhǎng)為8那么[0]補(bǔ)=00000000。
移碼:
移碼最簡(jiǎn)單了,不管正負(fù)數(shù),只要將其補(bǔ)碼的符號(hào)位取反即可。
例如:X=-101011 , [X]原= 10101011 ,[X]反=11010100,[X]補(bǔ)=11010101,[X]移=01010101
運(yùn)算過(guò)程:原碼->反碼->補(bǔ)碼->移碼
原碼 :二進(jìn)制(開頭第一個(gè)表示符號(hào)0正1負(fù))
反碼 :在原碼的基礎(chǔ)上,符號(hào)位不動(dòng),其他位取反 —注意,任何正數(shù)的源碼=反碼=補(bǔ)碼,而負(fù)數(shù)都是通過(guò)補(bǔ)碼表示的。
補(bǔ)碼 :在反碼的基礎(chǔ)上,運(yùn)算+1 —注意,任何正數(shù)的源碼=反碼=補(bǔ)碼,而負(fù)數(shù)都是通過(guò)補(bǔ)碼表示的。
公式:兩數(shù)補(bǔ)碼的和==兩數(shù)和的補(bǔ)碼。移碼 :在補(bǔ)碼的基礎(chǔ)上,符號(hào)位取反
101011(二進(jìn)制)–> 原碼 00101011 --> 反碼 01010100 --> 補(bǔ)碼 01010101–> 移碼 11010101
知道了計(jì)算方式后,我們應(yīng)該研究一下源碼、反碼、補(bǔ)碼的作用是什么?
1 首先看源碼
問(wèn):什么是源碼?
答:數(shù)字的二進(jìn)制形式(二進(jìn)制的數(shù))
問(wèn):為什么要用源碼?
答:我是從2個(gè)方面看 1 從目前計(jì)算機(jī)的構(gòu)造來(lái)看它只認(rèn)識(shí)1/0,所以任何指令、數(shù)字、都會(huì)翻譯成一個(gè)二進(jìn)制數(shù)傳遞給計(jì)算機(jī)。
2 規(guī)范和統(tǒng)一計(jì)算機(jī)的“交流語(yǔ)言”,統(tǒng)一對(duì)外的接口。總結(jié):源碼是計(jì)算機(jī)唯一認(rèn)識(shí)的語(yǔ)言結(jié)構(gòu)。
2 反碼和補(bǔ)碼
問(wèn):反碼是什么?
答:在源碼的基礎(chǔ)上符號(hào)位不動(dòng),其他取反
問(wèn):為什么要用反碼?
答:這個(gè)問(wèn)題需要配合補(bǔ)碼一起查看,因?yàn)檠a(bǔ)碼=反碼+1 所以一般的計(jì)算順序?yàn)?源碼–>反碼–>補(bǔ)碼
*問(wèn):補(bǔ)碼是什么?
答: 補(bǔ)碼=反碼+1(符號(hào)位參與運(yùn)算)
問(wèn):為什么要用補(bǔ)碼?
答:為了進(jìn)行做加減運(yùn)算,因?yàn)橛?jì)算機(jī)只有加法計(jì)算器,所以a-b的處理方式為a+(-b),而這過(guò)程中如果直接用源碼進(jìn)行計(jì)算會(huì)出現(xiàn)問(wèn)題
例1 10+(-10)= 0 (當(dāng)使用源碼進(jìn)行計(jì)算減法)
10(十進(jìn)制) – 00001010(源碼)
-10(十進(jìn)制) – 10001010 (源碼)
00001010+
10001010
1XXXXXXX ----->首先看到第一位是負(fù)數(shù),顯然不是我們想要的結(jié)果
例子2 10-11 (試試用減法直接做計(jì)算吧)
10(十進(jìn)制) – 00001010(源碼)
-11(十進(jìn)制) – 10001011(源碼)
00001010-
10001011
xxxxx11111----->可以看到貌似跟答案-1(十進(jìn)制)差距還是比較明顯的
現(xiàn)在我們嘗試應(yīng)用補(bǔ)碼進(jìn)行計(jì)算
例子3 10+(-10)=0 (使用補(bǔ)碼)
10(十進(jìn)制) — 00001010(源碼)----同源碼(反碼)----同源碼(補(bǔ)碼)
-10(十進(jìn)制) — 10001010(源碼)----11110101(反碼)----11110110(補(bǔ)碼)
00001010+ 10的源碼----注意正數(shù)用補(bǔ)碼(值等同于源碼)
11110110 -10的補(bǔ)碼----注意負(fù)數(shù)用補(bǔ)碼
00000000 得到了0的補(bǔ)碼
例子3 10-11 (使用補(bǔ)碼)
10(十進(jìn)制) — 00001010(源碼)----同源碼(反碼)----同源碼(補(bǔ)碼)
-11(十進(jìn)制) — 10001011(源碼)----11110100(反碼)----11110101(補(bǔ)碼)
00001010+ 10的補(bǔ)碼
11110101 -11的補(bǔ)碼
11111111— 得到了-1的反碼
從這4個(gè)例子可以看出反碼和補(bǔ)碼使用的作用了,用于為二進(jìn)制負(fù)數(shù)做運(yùn)算時(shí)的一種轉(zhuǎn)換。
再次總結(jié)運(yùn)算過(guò)程
數(shù)值有正負(fù)之分,計(jì)算機(jī)就用一個(gè)數(shù)的最高位存放符號(hào)(0為正,1為負(fù)).這就是機(jī)器數(shù)的原碼了.假設(shè)機(jī)器能處理的位數(shù)為8.即字長(zhǎng)為1byte,原碼能表示數(shù)值的范圍為 127~(-127)
運(yùn)算過(guò)程:原碼->反碼->補(bǔ)碼->移碼
原碼 :二進(jìn)制(開頭第一個(gè)表示符號(hào)0正1負(fù))
反碼 :在原碼的基礎(chǔ)上,符號(hào)位不動(dòng),其他位取反 —注意,任何正數(shù)的源碼=反碼=補(bǔ)碼,而負(fù)數(shù)都是通過(guò)補(bǔ)碼表示的。
補(bǔ)碼 :在反碼的基礎(chǔ)上,運(yùn)算+1 —注意,任何正數(shù)的源碼=反碼=補(bǔ)碼,而負(fù)數(shù)都是通過(guò)補(bǔ)碼表示的。
公式:兩數(shù)補(bǔ)碼的和==兩數(shù)和的補(bǔ)碼。移碼 :在補(bǔ)碼的基礎(chǔ)上,符號(hào)位取反
總結(jié)
以上是生活随笔為你收集整理的原码、反码、补码、移码及其运算的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 【数据库】Apache Doris :
- 下一篇: 增鑫科技更新招股书,冲刺深交所上市,正邦