在Java中,int是使用32位元表示,long使用64位元表示。這兩個基本型別都是整形,沒有其他的表示方法了。他們內部是怎麼表示的呢?是採用補碼表示。由於我們常在做題中會遇到Java的位元運算,Java的位元運算只能用於int和long型。所以我們有理由好好分析Java內部是怎麼用二進位表示的。這裡只舉int為例子,long是一樣的。
1、int的範圍
int在Java內部是用32位元來表示的,而最高位元是表示符號,因此真正可以表示數字的是31位元. Java的int型別取值範圍是-2^31~2^31-1.
為什麼範圍是這樣?這就牽涉到二進制的存儲方法了。
在Java中,是使用補碼來儲存int。對於一個正數,其補碼,就是本身。例如,我們舉4個位元來做例子。對於正數1-7,分別是0001,0010,。 。 。 ,0111,總共是7個數字,也就是2^3-1個。
對於0,可以看到問題來了。可以是-0,也可以是 0,都是0。決定怎麼表示0呢?補碼的法則規定,0認為是 0,因此0用0000表示。
這個時候,需要表示負數了。我們認為,一個負數,它的補碼表示是其絕對值取反(連同符號位元一起取反)再加1。例如,對於-5,它的絕對值為5,表示為0101,取反,為1010,加一為1011,這就是-5的補碼表示。
這時候,可以用1000來表示-8,於是負數的範圍是-2^31,這也解釋了int的值範圍。對於64位元的long也是完全一樣的。
2、Java的位元運算
Java的位元運算是怎麼做的呢?要記住,移位運算是整個數整體向左或右移動。如果是向左移,則是低位補0。如果是向右移,分成兩種情況。如果是0和正數,則高位補0。如果是負數,則高位補1。如對於-5為1011,右移一位為1101,也就是-3。
還有一種位元運算。如果是位元運算,記得符號位也是要參與的!
3、右移與除法的關係
對於正數(當然0也是)來說,右移一位等於除以2的結果,但對於負數來說不是(確切地說是除以2的結果-1)!例如,-5/2結果是-2,-5>>1結果是-3。
4、正負號與整數除法、取餘運算的關係
正數/正數,向下取整數
負數/負數,等於他們的絕對值相除
正數/負數和負數/正數,就是他們絕對值相除乘以負號。
至於%的結果,結果的絕對值與他們絕對值的取餘一樣,但是符號由第一個數決定。
5、為什麼要用補碼?
(1)前面已經說過,為了合理地表示0和-0;
(2)可以在負數處多表示一個最負的數;
(3)使用補碼,可以將符號位元和其它位元統一處理;同時,減法也可依加法來處理。另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。
其實很大一個原因是為了計算加減法方便。在使用補碼系統運算的時候,是可以把符號位元加起來一起運算的。在位元運算中,如果符號位有進位,是可以捨棄的,因為已經超出了位元範圍了。對於正數和正數相加,沒什麼特別的。下面例子都是8個位元的。例如,對於7 7,也就是00000111 00000111,結果是00001110,為14。
而對於減法,例如9-4,我們就認為是9 (-4),先對4,也就是00000100取反再加一,得到-4的補碼表示11111100,然後相加,也就是
00001001(9)
11111100(-4)
? 100000101
最後一位符號位元的進位1,因為已經超出了比特範圍,所以直接捨棄,可以直接就得到5了。所以這也就是實現了減法變加法。
以上是java int是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!