關於源碼,反碼,補碼(正數--負數)---------(-128)自己的理解


以一個字節為例

1、無符號位,一個字節可以存放0~255共256個數字;有符號位存放-128~127共256個數字;

2、無符號全都表示為正數;有符號位則首位表示正負數,正數首位為0,負數首位為1(因此在判斷一個數為正還是負時會先看首位,如果為正直接算,如果為負還要經過求反碼、源碼)

以下以默認的有符號位示例

3、首先,要知道計算機中正數用源碼表示,負數用其正數的補碼表示;補碼為源碼的反碼加一(如-1即為1的反碼加一表示)

  1:0000 0001

   -1:1111 1111

  從1到-1的計算過程:0000 0001  取反碼為  1111 1110

             1111 1110   +1為補碼  1111 1111

  因此-1表示為 1111 1111

4、如果給你一個負數,要求你用二進制表示;

  第一:先判斷這個負數是否溢出(不管正負都要判斷),如果溢出就不能表示,如果要強制轉換就會造成數據不一致,那么原始數據就會丟失;

     如果不溢出,就下一步;

  第二:先用二進制表示出其對應的絕對值(正數)的二進制源碼;

  第三:根據源碼求反碼,源碼取反(~源碼);

  第四:根據反碼求補碼表示負數,反碼+1;

5、如果給你一個負數的二進制,求該二進制表示的負數為幾;

  第一:先求補碼,該負數的二進制-1;

  第二:根據補碼求源碼,補碼取反(~補碼);

  第三:將源碼算出代表幾;

 

關於牛客網題目的理解(正確答案為 B)

前言:不管什么都是按照上訴4、5計算;

  • 比如4,當正數溢出時,他還是會把源碼先(擴容后:如原本只裝1個字節,但是裝不下就擴用2個字節表示)表示出來,然后從低位截取再判斷正負再進行計算;
  • 當負數溢出時,他還是會將源碼表示出來,然后根據規則算出補碼,最后截取后存儲。由於截取后數值就變啦,因此所表示的就不是原來的數了,至於表示幾自己根據規則再算回去,有時甚至會變為正數就是這個原因;

 

因此這道題我是這么做的:

因為a為short類型,一共16位,表示128為:0000 0000 1000 0000

b為byte類型,一共8位,將a強制轉換后為:1000 0000

為什么1000 0000表示-128呢,我自己的理解是:

  1. 首先首位為1,則表示為負數 ,負數用補碼表示,所以1000 0000為補碼
  2. 補碼-1為反碼,即0111 1111
  3. 反碼取反,為1000 0000
  4. 1000 0000表示的的正值為27=128(這樣既符合正負數表示方法,數學數值上也說得通,包括16位的10000000 00000000表示-32768等等也是這個道理);所以1000 0000表示-128

總結:因此我認為通過負數二進制求其表示的數時,最后得出源碼后,應該是求源碼表示的正值;而1000 0000在byte中比較特別,因為它的補碼與源碼相同,所以最后得出源碼時會比較懵逼,但如果記住這時該求正值就行了;以后自己按照這個計算方法計算便可以,方便好記


免責聲明!

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



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