5源碼反碼
❶ 源碼 反碼 補碼的概念
帶符號數,有三種表示方法,即:原碼、反碼和補碼。
但是,在計算機系統中,數值一律用【補碼】來表示和存儲。
所以,在計算機系統中,原碼和反碼,都是不存在的。
使用補碼的意義:可以把減法或負數,轉換為加法運算。
因此,就能簡化計算機的硬體。
=====================
補碼的概念,來自於:補數。
比如鍾表,時針轉一圈,周期是 12 小時。
那麼,倒撥 3 小時,可以用正撥 9 小時代替。
9,就是-3 的補數。計算方法:9 = 12-3。
同理,分針倒撥 X 分,可以用正撥(60-X)代替。
60,是分針的周期。
同理,三角函數的周期是 2π。那麼,
在-π/2 處的函數值,就與2π-π/2 = +3π/2處相同。
------------
當你使用兩位十進制數:0~99,周期就是 一百。
那麼,減一,就可以用 +99 代替。
24-1 = 23
24 + 99 = (1) 23
舍棄進位,這兩種演算法,功能就是相同的。
於是,99 就是 -1 的補數。
其它負數的補數,可以按照下式來求:
補數 = 周期 + 負數
------------
計算機中使用二進制,補數,就改稱為【補碼】。
八位二進制是:0000 0000~1111 1111。
相當於十進制:0~255,周期就是 256。
那麼,-1,就可以用 255 = 1111 1111 代替。
所以:-1 的補碼,就是 1111 1111 = 255。
同理:-2 的補碼,就是 1111 1110 = 254。
繼續:-3 的補碼,就是 1111 1101 = 253。
。。。
最後:-128 的補碼,就是 1000 0000 = 128。
負數補碼的計算公式:【 256 + 這個負數 】。
(式中的 256 = 2^8,是八位二進制的周期。)
正數,並不存在補碼的問題。
所以,正數,並沒有補碼,可以直接運算。
(也有人亂說:正數本身就是補碼。)
------------
求解算式:7-3 = 4。
計算機中,並沒有減法器,必須改用補碼相加。
列豎式如下:
7 的補碼=0000 0111
-3的補碼=1111 1101
--相加-------------
得:(1)0000 0100= 4 的補碼
舍棄進位,只保留八位,結果完全正確。
------------
藉助於補碼,可以簡化計算機的硬體。
原碼和反碼,都沒有這種功能。
所以,在計算機中,根本就沒有原碼和反碼。
它們都是什麼?就不用關心了。
❷ 什麼是源碼,反碼,補碼
這三個都是二進制數,如果源碼是正的,那麼反碼,補碼都是和源碼是一樣的,如果源碼是負的話,其中最高位是符號位,1表示負,0表示正。比如-15,它的源碼是10001111,反碼就是把源碼的0和1互換位置,其中符號位不變。-15的反碼是11110000,補碼就是在反碼的基礎上末尾加1就行了
❸ 計算機源碼,反碼,補碼之間怎麼計算
轉換方法:
如果是正數或零,則首位為 0,補碼=原碼=反碼。
否則,首位為 1,數值位取反加一,即可實現「補碼與原碼」互換。
例如:
對 1111 1001 取反,為 1000 0110,再加一,得:1000 0111。
對 1000 0111 取反,為 1111 1000,再加一,得:1111 1001。
這說明,補碼 ←→ 原碼,方法是相同的。
❹ 原碼,反碼,補碼。和他們之間的轉換
是原碼
不是源碼
對於整數:補碼反碼原碼都是一樣的,也就是它本身的二進制
對於負數:
原碼:絕對值的原碼,將最高為變1
反碼:絕對值的原碼按位取反
補碼:絕對值的原碼按位取反再加1
❺ 原碼,反碼,補碼,移碼
寫在前面:該文章為本人學習中寫的一些筆記和心得,發表出來主要是為了記錄自己的學習過程。本人才疏學淺,筆記難免存在不足甚至紕漏,但會不定期更新。
基本知識:假設有一個n位的二進制數
則這個二進制數共有 種狀態,這個數最大為
反過來 ,寫成二進制為1000 0000,一共有8位,1後面 7 個小數
以下舉例均為n位數,實例為8位數
原碼
簡單直接的二進制,以下以定點數為例。
定點純小數: 0 100 0000 首位為符號位,0為正1為負,這里表示0.1(10)
定點純整數: 0 000 0001 這里表示1(10)
因為有符號位,所以有正負零之分 0 000 0000 和 1 000 0000
數據范圍:-127~127(後面7位全為1)//公式表達為
特點:原碼不適合加減,但 適合乘除
反碼
正數的反碼與其原碼相同;負數的反碼是對其符號位後的原碼逐位取反,符號位不變(為1)
反碼能表達的數據范圍:與源碼一樣
補碼
目的:方便計算機進行加減
特點:在機器中適合加減的數字表示方式
補碼能實現計算機"加上負數"的本質原理是模運算,也就是A減去B等於A加上B相對於A的補數再求模。就好像時鍾順時針撥動3h和逆時針撥動9h得到的結果一樣。
二進制求補碼:
補數=(原數+模)(mod 模),很明顯,若原碼是正,則補碼是它本身,對於正數完全不用考慮求補碼。
對於計算機,因為兩個相加的數的位數相同(n),且和不能超過n+1位,因此應該取的模是100000...(n個0)。
因此對於n位純小數,它的模(十進制)為2 ,對於n位純整數,它的模為2 n
模 : (1 0 000 0000)
原碼: ( 0 000 0000)
注意到,盡管符號位沒有任何數值信息,這里取模依然把符號位考慮進去了,原因是我們可以通過定義補碼,來使第一個符號位參與計算機計算,從而得到想要的結果。
(同時,把符號位算進去可以讓我們在用數學公式法求二進制補數時,直接從結果得到補碼
例: x= -0.1011
[x]補=10+x=10.0000-0.1011=1.0101
原來是要取模得補數為0.0101(2),但正好首位的1可以表示原數的負號,因此可直接讀出補碼為1 0101
)
因此對於補碼,符號位既起指示正負號的作用,又參與運算。
另外,區別於原碼有兩個0(正負0),在補碼的規定中,只有一個0(00000...的正0,因為原碼也全是0),而1 0000...可以表示-1(補碼純小數)或-2 n-1 (補碼純整數)
//可以這么記(以純整數為例):因為後面n-1個0取反後為n-1個1,加1後為2 n-1 (10),前面一個1表示負數,因此補碼能表示-2 n-1
補碼怎麼來:原碼為正,補碼與原碼相同;原碼為負,後面的位數為原碼取反加1
移碼
目的:為了方便計算機比大小,消除符號位對計算機的干擾
原理是把負數部分全部移到非負數方向,也就是說要把第一位符號位的意義給消除掉。消除方法為:對於補碼的正數,符號位由0變為1,增大;對於補碼的負數,符號位概念消除,在計算機中被定義為正數,又為了確保原負數小於原正數,符號位由1變為0。
為了保證每個數之間大小關系不變,要用補碼來轉換成移碼,用原碼來轉換的話,負數之間的大小關系會反轉。
數學公式:
宏觀上來看是把居中的整個數軸平移到了非負半軸上,每個數之間的大小關系不變。
純小數[X] 移 =1+X
純整數 [X] 移 = (一般標准)
移碼怎麼來: 移碼和補碼尾數相同,符號位相反 (也就是補碼 首位的1->0 ;0->1)
因為移碼從補碼那裡來,所以也能額外多表示一個數
❻ 整理一下關於原碼反碼補碼筆記
一個數據表示時使用,第一位為符號位,剩餘的為有效位
字16位 1位符號 15有效數據位
int>整數 4個位元組32
-2 31-2 32-1
long>長整形8個位元組64一位符號63
-2 63-2 63-1
1000 0111 (-7)二轉十
機器數
機器數就是一個數在計算機中二進製表現形式
+3 0000 0011
+7 0000 0111
-5 1000 0101
機器數的真值
將帶符號位的機器數對應的真正數值稱為機器數的真值
0000 0011 = +3
0000 0111 = +7
1000 0101 = -5
原碼就是符號位加上真值的絕對值
求原碼:
34=00100010
原碼 -39 1 0 1 0 0 1 1 1
原碼 -55 1 0 1 1 0 1 1 1
正數:正數的反碼=源碼 如 +9:0000 1001 源碼=0000 1001 反
負數:符號位不變,其餘各位琢一取反,只有兩種狀態{0,1},即1->0 0->1
負數
負數的反碼是保持符號位不變,其餘各位直接取反
取反: 只有0 和 1兩種狀態,也就是 0 -> 1 , 1 -> 0
-3 1000 0011[原] = 1111 1100[反]
正數:正數的原碼=反碼=補碼 如+3 0000 0011 {原}=0000 0011{反}=0000 0011 {補}
負數:先求的反碼,在負數反碼的基礎上,加一
補碼需要在反碼的基礎上轉換得到
正數
正數的原碼 反碼 補碼 全部相同
+1 0000 0001[原] = 0000 0001[反] = 0000 0001[補]
負數
負數的補碼需要在反碼的基礎上,最後一位加 1;
-3 1111 1100[反] = 1111 1101[補
擴展
為什麼需要反碼和補碼?
在設計計算機時,只設計了加法器沒有設計減法器
5-3=5+(-3)
原碼
5=0000 0101 (原碼)
-3=1000 0011 (原碼)
0000 0101
1000 0011
1000 1000 結果(原碼)=-8
原碼不可以直接計算的!
反碼:解決了只設計加法器,使用加法器進行減法運算的問題;
缺點:正負相加0的表示不唯一
1-1=1+(-1)
1=0000 0001 {反}
-1=1000 0001 {原碼}
-1=1111 1110 {反碼}
0000 0001
1111 1110
1111 1111 {反碼}=1000 0000{原碼}=-0 負0
補碼{高位溢出}
1=0000 0001{補}
-1=1111 1111{補}
0000 0001
1111 1111
0000 0000
一個位元組8位,表達的范圍-2 7-2 7-1
32+12=44
44-12=32
44+(-12)=32
將補碼轉原碼
因為負數的補碼不能直接讀出結果,但是原碼可以,所以將補碼轉原碼,可以讀出負數的值
補碼>原碼
原則:==補碼的補碼
把補碼當原碼,求補碼
計算規則:符號位不變,其餘取反,加1;
ASCll編碼:最早的最重要的基本的英美文字的字元集
只使用了低7位二進制,其他的認為無效,它使用了0-127這128個碼位。剩下128個碼位留作擴展,採用順序存儲方式存儲字元
ISO-8859-*
使用ASCll 剩餘的碼位進行擴展
iso-8859-1專門對英語做的擴展 tomcat>默認採用iso-8859-1》utf-8
西歐國家較多,各個國家在ASCll基礎上,擴展形成了自己國家專用的編碼,最終形成了ISO-8859-*系列
GB2312
GB2312字集是簡體,6763個簡體漢字
BIG5
繁體字集
Unicode
字元集(簡稱為UCS)
GBK【936】
是簡繁字集,包括GB2312字集,BlG5字集合一些符號,共包括21003個字元。GBK編碼是GB2312的超級,向下完全兼容GB2312
UTF-8[65001]萬國碼
包含全世界所有國家需要用到的字元,是國際編碼,它對英文使用8位(即一個位元組),中午使用3個位元組
ANSl
ANSl不是一種具體的編碼
系統默認的編碼決定,如果系統的默認的編碼是GBK> ANSl就代表 GBK
認識ASCll碼表
常用:0-9 A-Z a-z對應的ASCll碼分別為:48-57,65-90,97-122
0>48
A>65
a>97
❼ 原碼,反碼,補碼和移碼: 原碼:1001101,反碼,補碼,移碼各是多少
解:首位數字表示正負不做變(1為負數,0為正數)
反碼:1110010(正數反碼等於原數,題中為負數,則除首位數對應取反)
補碼:1110011(得出反碼數基礎上末位加一)
移碼:0110011(補碼符號位第一位數字取反)
反碼是數值存儲的一種,多應用於系統環境設置,如linux平台的目錄和文件的默認許可權的設置umask,就是使用反碼原理。
補碼(2's complement)是一種用二進製表示有號數的方法,也是一種將數字的正負號變號的方式。
移碼(又叫增碼)是符號位取反的補碼,一般用指數的移碼減去1來做浮點數的階碼,引入的目的是為了保證浮點數的機器零為全0。
(7)5源碼反碼擴展閱讀
補碼的設計目的是:
1.使符號位能與有效值部分一起參加運算,從而簡化運算規則.
2.使減法運算轉換為加法運算,進一步簡化計算機中運算器的線路設計 所有這些轉換都是在計算機的最底層進行的,而在我們使用的匯編、C等其他高級語言中使用的都是原碼。
小數和分數的補碼:
1.十進制分數補碼可以先將分子和分母分別表示成二進制數,然後計算出二進制小數,再按下面第三步的方法將求出小數的補碼形式。
2.十進制小數的補碼也應該先將其轉換成二進制小數,再按下面第三步的方法將求出小數的補碼形式。
❽ C語言中,什麼是補碼、源碼、反碼分別怎樣計算
一、原碼
求原碼:X≥0,則符號位為0,其餘照抄;
X≤0,則符號位為1,其餘照抄。
【例1】X=+1001001 [X]原 = 01001001
【例2】X=-1001001 [X]原 = 11001001
二、反碼
求反碼:若X≥0,符號位為0,其餘照抄;
若X≤0,符號位為1,其餘按位取反。
【例3】X=+1001001 [X]反 = 01001001
【例4】X=-1001001 [X]反 = 10110110
三、補碼
求補碼:若X≥0,符號位為0,其餘照抄;
若X≤0,符號位為1,其餘取反後,最低位加1。
【例5】X=+1001001 [X]補 = 01001001
【例6】X=-1001001 [X]補 = 10110111
❾ -5的原碼、反碼和補碼各是多少啊,5呢
-5的原碼、反碼和補碼各是10000101、11111010和11111011。
5的原碼、反碼和補碼各是00000101、01111010和01111011。
計算機中的存儲系統都是用2進制儲存的,對我們輸入的每一個信息它都會自動轉變成二進制的形式,而二進制在存儲的時候就會用到原碼,反碼和補碼。
例如:輸入25
原碼就是:0000000000011001
反碼: 1111111111100110
補碼: 1111111111100111
(9)5源碼反碼擴展閱讀:
補碼是為了計算方便而發明的。原始計算器只能做加法不能做減法,但是科學家發現,例如7+(-5)=2可以這樣算:7+(-5) = 7+(10000-5)-10000 = 10002 - 10000 = 2 。
這很奇怪,因為機器太傻,只能做加法,但是雖然不會減法,-10000還是很方便的,只要去掉開頭的1;用10000減也是很方便的,因為可以用9999減然後+1,而用9999減,只要把每一位用9減。