以一個位元組為例 1、無符號位,一個位元組可以存放0~255共256個數字;有符號位存放-128~127共256個數字; 2、無符號全都表示為正數;有符號位則首位表示正負數,正數首位為0,負數首位為1(因此在判斷一個數為正還是負時會先看首位,如果為正直接算,如果為負還要經過求反碼、 源碼) 以下以預設的 ...
以一個位元組為例
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,則表示為負數 ,負數用補碼表示,所以1000 0000為補碼
- 補碼-1為反碼,即0111 1111
- 反碼取反,為1000 0000
- 1000 0000表示的的正值為27=128(這樣既符合正負數表示方法,數學數值上也說得通,包括16位的10000000 00000000表示-32768等等也是這個道理);所以1000 0000表示-128
總結:因此我認為通過負數二進位求其表示的數時,最後得出源碼後,應該是求源碼表示的正值;而1000 0000在byte中比較特別,因為它的補碼與源碼相同,所以最後得出源碼時會比較懵逼,但如果記住這時該求正值就行了;以後自己按照這個計算方法計算便可以,方便好記