最近學習java基礎語法的時候,對其基本數據結構中的二進制位數與十進制大小間的轉換產生了疑惑,想起學習IP地址的時候也貌似產生了相同的困惑,
所以干脆總結一下,權當學習及備忘了。
在計算機內,定點數有3種表示法:原碼、反碼和補碼
原碼:就是二進制定點表示法,即最高位為符號位,“0”表示正,“1”表示負,其余位表示數值的大小。
反碼:表示法規定:正數的反碼與其原碼相同;負數的反碼是對其原碼逐位取反,但符號位除外。
補碼:表示法規定:正數的補碼與其原碼相同;負數的補碼是在其反碼的末位加1。
首先需要明確是java中是用補碼表示二進制數,補碼的最高位是符號位,最高位為“0”表示正數,最高位為“1”表示負數。
正數補碼為其本身;
負數補碼為其絕對值各位取反加1;(這里還記得“若干年”前C語言老師說的一句“各位取反,末位加一”。。。)
例如:
+21,其二進制表示形式是00010101,則其補碼同樣為00010101
-21,按照概念其絕對值為00010101,各位取反為11101010,再加1為11101011,即-21的二進制表示形式為11101011
步驟:
1、byte為一字節8位,最高位是符號位,即最大值是01111111,因正數的補碼是其本身,即此正數為01111111
可以借助等比數列的求和公式,得到其十進制表示形式為(2^7-1)即127
2、最大正數是01111111,那么最小負是10000000(最大的負數是11111111,即-1)
需要強調的是,由於正數的原碼、補碼都一樣,求其十進制大小的時候無需轉換(所以也容易產生混淆),
而負數則不同。此處的最大正數01111111和最小負數10000000都是補碼形式(java的語言規定。。)
3、10000000是最小負數的補碼表示形式,我們把補碼計算步驟倒過來就即可。10000000減1得01111111然后取反10000000
因為負數的補碼是其絕對值取反,即10000000為最小負數的絕對值,而10000000的十進制表示是128,所以最小負數是-128
4、由此可以得出byte的取值范圍是-128到+127
對於負數而言,需要掌握兩種情況:知道其大小(十進制值),求補碼;知道其補碼,求其大小。
一個十進制負數轉換成其二進制補碼表示的時候,步驟為:
負數--->正數(取絕對值)---->二進制補碼---(末位減一,各位取反)>二進制原碼
-128 128 1000 0000 0111 1111 1000 0000