Java學習--反碼 原碼 補碼簡析
阿新 • • 發佈:2018-10-05
技術分享 學習 new charat color 分享圖片 相加 -- ...
關於課上實驗中對小數的處理中出現的問題涉及到原碼,反碼,補碼的問題,所以在網上進行了一下搜索。
在原碼,反碼,補碼中的解釋可得知,無論是哪一種碼,能夠表示的數的範圍是-2^(位數-1)-1至2^(位數-1)-1;
原碼:二進制的在最高位數若為1, 則表示這個數為負數,最高位數為0,表示負數,其值大小就是最高位數除外的二進制轉換成10進制的大小,最高位數表示符號;
反碼:二進制的在最高位數若為1, 則表示這個數為負數,最高位數為0,表示負數,正數的值就是最高位數除外的二進制轉換成10進制的大小,負數的值是正數按位取反的值。
補碼:二進制的在最高位數若為1, 則表示這個數為負數,最高位數為0,表示負數,正數的值就是最高位數除外的二進制轉換成10進制的大小,負數的值是正數按位取反的值在加上1所得的值。
假如有一計算機,是4位,那對這4位進行計算。通過了解,可以取-7至7的值。
假如有兩個數5,-1,計算他們的加法;
原碼:
5/2=2...1;
2/2=1...0;
1/2=0...1;
即5用二進制表示0101;
-1用二進制表示1001;
原碼5+(-1)則表示 1110;
表示-6;
所以原碼不能用來計算
反碼:
5用二進制表示0101;
-1用二進制表示1110;
兩數相加,0011(位數超過4的部分舍去);
表示3;
反碼同樣不能用來計算。
補碼:
5用二進制表示0101;
-1用二進制表示1111;
兩數相加,用二進制表示:0100;
表示4;
此時表達正確,故計算機是用補碼表示加減。
在程序中測試的代碼如下:
package wei; publicclass Wei { public static int getString(String a) { int a1=0; for(int i=0;i<4;i++) { if(a.charAt(3-i)==‘1‘) a1+=(1<<(i)); } // if(a.charAt(0)==‘1‘) // a1=-a1; return a1; } public staticint add(int a,int b) { int c=0; c+=(((a+b)&8)>>3!=1)?((a+b)&7):-((a+b)&7); return c; } public static void main(String[] args) { // TODO 自動生成的方法存根 String a=new String("0101"); String b=new String("1001"); System.out.println("原碼表示5+(-1)="+add(getString(a),getString(b))); b="1110"; System.out.println("反碼碼表示5+(-1)="+add(getString(a),getString(b))); b="1111"; System.out.println("補碼碼表示5+(-1)="+add(getString(a),getString(b))); } }
實驗截圖如下:
Java學習--反碼 原碼 補碼簡析