二進制(原碼、反碼、補碼)


前言:

   bit(位):數據存儲的最小單元。在計算機二進制系統中,位,簡記為b,也稱為比特(bit),每個二進制數字0或1就是一個位(bit),其中每 8bit = 1 byte(字節);

   Java 中的int數據類型占4個byte(字節),而1 byte(字節) = 8 bit(位);(說白了,在二進制系統中是以bit 作為數據存儲單元的)

 

二進制

    二進制在計算機技術中廣泛應用。二進制數用0和1兩個數字及其組合來表示任何數,二進制的進位規則是:“逢2進1”。數字1在不同的位上代表不同的值,按從右至左

    的次序,這個值以2倍遞增。

 

無符號數和有符號數

     在計算器中參與運算的數有兩大類:無符號數和有符號數

     (1)有符號數:

          對於有符號數而言,符號的正、負機器是無法識別的,但由於“正、負”恰好是兩種截然不同的狀態,如果用“0”表示“正”,用“1”表示“符”,這樣符號也被數字化了,

          並且規定將它放在有效數字的前面,即組成了有符號數。所以,在二進制中使用最高位(第一位)來表示符號,最高位是0,表示正數;最高位是1,表示負數。

     (2)無符號數:

          無符號數是針對二進制來講的,無符號數的表數范圍是非負數。全部二進制均代表數值(所有位都用於表示數的大小),沒有符號位。即第一個"0"或"1"不表示

          正負。

 

    例子:

    (1)在Java中int數據類型是怎么在計算機中表示的呢?

         在二進制系統中是以bit(位)來作為數據存儲單元的(詳細內容請看前言),假設 int  number = 1 ,那么number在計算機系統中將表示如下:

         00000000  00000000  00000000  00000001

         同理可得,number=-1 時,在二進制中表示如下:

         10000000  00000000  00000000  00000001

         注意:最高位(第一位)是符號位,因為是number值為1是一個正數,所以最高位為0;

 

    (2)二進制轉十進制?

         要從右到左用二進制的每個數去乘以2的相應次方(次方要從0開始算起);

         假如:二進制數1101轉化成十進制 ,那么 1101 = 1*20+0*21+1*22+1*23 = 1+0+4+8 = 13;

         注意:任何數的0次方都是1。

 

二進制中的原碼、反碼、補碼

      對於有符號數而言:

      (1)二進制的最高位是符號位:0表示正數,1表示負數

      (2)正數的原碼、反碼、補碼都一樣;

      (3)負數的反碼 =  它的原碼符號位不變,其他位取反(0 ->1 ; 1->0 );

      (4)負數的補碼 = 它的反碼 +1;

      (5)0的反碼、補碼都是0;

      (6)在計算機運算的時候,都是以補碼的方式來運算的;

      

      例子:

      下面我們就使用“有符號數”來模擬一下,在計算機中是怎樣運算的。

      (1)正數相加:

           例如:1+1 ,在計算機中運算如下:

           1的原碼為:

           00000000  00000000  00000000  00000001

           因為“正數的原碼、反碼、補碼都一樣”,所以,1的補碼 = 1的原碼,所以 1的補碼+ 1的補碼 就等於:

           00000000  00000000  00000000  00000001

           +

           00000000  00000000  00000000  00000001

           =

           00000000  00000000  00000000  00000010

           00000000  00000000  00000000  00000010( 轉換為10進制) = 0*2^0 + 1*2^1 = 0 + 2 =2 

      (2)正數相減:

           例如:1-2,在計算機中運算如下:

           在計算機中減運算其實是作為加運算來操作的,所以,1-2 = 1 + ( -2 )

           第一步:把 1補碼找出來(因為正數的原碼、反碼、補碼都一樣,所以我們可通過原碼直接獲取補碼):

             1的補碼:

             00000000   00000000   00000000   00000001

           第二步:把-2的原碼找出來:

             -2的原碼:

             10000000   00000000   00000000   00000010

           第三步:把-2的反碼找出來:

             -2的反碼:

             11111111     11111111     11111111     11111101

           第三步:把-2的補碼找出來:

             -2的補碼:

             11111111     11111111     11111111     11111110

           第四步:1的補碼與-2的補碼相加:

              00000000   00000000   00000000   00000001

              +

              11111111     11111111     11111111      11111110

              =

              11111111     11111111     11111111      11111111

           第五步:將計算結果的補碼轉換為原碼,反其道而行之即可(如果想將二進制轉換為十進制,必須得到二進制的原碼)

              補碼:11111111     11111111     11111111      11111111

              =

              反碼:11111111     11111111     11111111      11111110

              =

              原碼:10000000  00000000   00000000    00000001

          第六步:將計算結果的二進制原碼 轉換 為十進制

              二進制原碼:10000000  00000000   00000000    00000001  =  1*2^0 =  -1

 

JAVA中所有的數字變量都是有符號(正負)的?

       這句話,還有點爭議。在Java中char類型是:16位Unicode字符,取值范圍 0 ~ 65535 , 不存在負數范圍,從這點上說:"char類型就是一個

       無符號數";

 

注意點:

     (1)正數的原碼、反碼、補碼都一樣;

     (2) 如果想將 二進制 轉為 十進制,必須使用 二進制的原碼;

 

學習了關於”二進制“的知識后,下面 ,我們將學習Java中”位運算符“與”移位運算“!     


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM