java用的原码还是反码_java 原码 反码 和补码
--------- 原碼、補碼、反碼
計算機是數(shù)字電路設(shè)備,由復(fù)雜的電子元器件組合而成,一個電子元器件在工作時,可以分為兩種狀態(tài)--高電平和低電平,表示數(shù)據(jù)用高電平表示1,低電平表示0,而多個電子元器件組合在一起時就可以表示更多的狀態(tài),即更多的數(shù)據(jù),如:000表示0,001表示1,010表示2等等,這也就是我們所說的2進制數(shù)據(jù)表示法。我們把一個電子元器件表示的數(shù)字稱為1位(bit),計算機一般將8個電子元器件組合成一個單元,稱為一個字節(jié)(byte),即這個單元可以表示2^8=256個數(shù)字,取值范圍0~255.
一個字節(jié)有8位,每一位都只可以表示兩個數(shù)字0、1,我們把最左邊的一位稱為最高位,最右邊的一位稱為最低位。為便于描述,這里采用1個字節(jié)表示一個整數(shù)。
原碼:
把最高位作為符號位,0表示正數(shù),1表示負數(shù)。其余各位代表數(shù)值本身的絕對值,例如:
1表示為0000 0001,-1表示為1000 0001
7 表示 0000? 0111?? -7 原碼表示為: 1000 0111
但是計算機并沒有采用原碼的計數(shù)方式表示數(shù)據(jù),為什么呢?? 問題出在這:+0表示為0000 0000,-0表示為1000 0000.
這樣一來+0似乎不等于-0了。
反碼:
反碼的表示分為兩種情況:
如果一個數(shù)為正數(shù),則反碼和原碼相同. 同時 補碼也和他們相同.
如果一個數(shù)為負數(shù),則符號位不變,其余各位按原碼取反。
例如:?? 1的原碼為0000 0001,反碼為0000 0001.
-1的原碼為1000 0001,反碼為1111 1110.
同樣的問題存在于反碼:+0的反碼為0000 0000??? -0的反碼為1111? 1111。正因為如此,人們尋找出了一種真正能使計算機表示數(shù)據(jù)無歧義的數(shù)據(jù)表示方法:補碼。
補碼:
模的概念:模是計量系統(tǒng)的計量取值范圍。例如:時鐘就可以看成是個計量器,它的取值范圍是0~11,即模(mod)=12,
計算機也可以看成計量器。
“模”的實質(zhì)是計量器“溢出”的量,是計量器不能表示的數(shù)值。任何有模的計量器都能化減法為加法運算,例如:在以10為模的系統(tǒng)中,8和2相對于模來說互為“補數(shù)”,實際上1和9,3和7等都有這個共同點,他們加起來等于10(模),他們都互為補數(shù),那么,6-2 =4,2和8互為“補數(shù)”,6+8 = 14,去掉一個“模”:10,即14-10 =4;
在計算機中 數(shù)字用補碼表示, 主要是為了0 的交叉問題:
+0 的原碼:0000 0000
+0 的反碼 0000 0000
+0 的補碼: 0000 0000
-0 的補碼: 0000 0000 導(dǎo)致結(jié)果一樣 .因此 用補碼表示 計算中的數(shù)字.
為什么要設(shè)立補碼呢?
第一是為了能讓計算機執(zhí)行減法:
[a-b]補=a補+(-b)補
第二個原因是為了統(tǒng)一正0和負0
正零:00000000
負零:10000000
這兩個數(shù)其實都是0,但他們的原碼卻有不同的表示。
但是他們的補碼是一樣的,都是00000000
特別注意,如果+1之后有進位的,要一直往前進位,包括符號位!(這和反碼是不同的!)
[10000000]補
=[10000000]反+1
=11111111+1
=(1)00000000
=00000000(最高位溢出了,符號位變成了0)
同樣,在計算機里面,n位計算機,設(shè)n=8,則他所能表示的數(shù)據(jù)取值范圍是1111 1111,若再將該數(shù)值加1,等于1 0000 0000
有9位,由于計算機只有8位,所以最高位自然丟失,又變成0000 0000,所以,n位計算機的模就是2^n,這樣,計算機就可以把減數(shù)用它相應(yīng)的補數(shù)代替了。把補數(shù)用到計算機數(shù)的處理上,就叫補碼。
補碼表示:
如果一個數(shù)為正,那么補碼、反碼原碼都相同,如果一個數(shù)為負,那么他的補碼就是他的反碼加1。
,-42就是通過將42的二進制代碼的各個位取反,即對00101010 取反得到11010101 ,然后再加1,得到11010110 ,即-42 。
-42
1. 先得到它的絕對值轉(zhuǎn)換成的二進制: 0010 1010 或者是得到-42 原碼:1010 1010
2. 然后對這個值取反 1101 0101 或著是 原碼取反碼:? 負數(shù)取反的步驟是;最高位不變,其他位取反 1101 0101
3 在這個再加1?????????? 1101 0110 (1+1 =10)
其實第1 種做法是錯誤的, 因為 補碼:反碼+1 .? 應(yīng)該先求得 -42 的原碼 : 然后求反: 然后+1 ,而不應(yīng)該是絕對值取反 因為正數(shù)的原碼 和反碼,補碼都相同.
對正數(shù)取反? 得到的結(jié)果就不是反碼了. 只是單純的取反.
負數(shù)的原碼怎么求: 先得到正數(shù)的二進數(shù),然后把最高位變?yōu)?.
負數(shù)的反碼怎么求: 在原碼的基礎(chǔ)上,最高位不變, 其他各位取反.
未完。。。。繼續(xù)寫
與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的java用的原码还是反码_java 原码 反码 和补码的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java 共享内存获取写权限_跨进程访问
- 下一篇: java泛型循环break contin