1. 程式人生 > >【Java基礎】Java基本數據類型與位運算

【Java基礎】Java基本數據類型與位運算

右移 數據 bits 類型 span 網上 height 使用 常數

1.賦值運算符

賦值使用操作符“=”。它的意思是“取右邊的值(即右值),把它復制給左邊(即左值)”。右值可以是任何 常數、變量或者表達式 (只要它能 生成 一個值就行)。但左值必須是一個明確的,已命名的變量。也就是說,必須有一個物理空間可以存儲等號右邊的值。
分類 基本數據類型 與 類數據類型 的不同
1、 對基本數據類型的賦值是很簡單的。基本數據存儲了實際的數值,而並非指向一個對象的引用,所以在為其賦值的時候,是直接將一個地方的內容復制到了另一個地方。
2、 但是在為對象“賦值”的時候,情況卻放生了變化。對一個對象進行操作,我們真正操作的是對對象的引用。----這種特殊的現象通常稱作“別名現象”,是Java操作對象的一種基本方式。

----摘抄自《Thinking In Java》P39

2. 字節、字、bit、byte的關系

1 Byte = 8 Bits
1 KB = 1024 Bytes
1 MB = 1024 KB
1 GB = 1024 MB
bps 是 bits per second 的簡稱。一般數據機及網絡通訊的傳輸速率都是以「bps」為單位。如56Kbps、100.0Mbps 等等。
Bps即是Byte per second 的簡稱。而電腦一般都以Bps 顯示速度,如1Mbps 大約等同 128 KBps。

3.基本數據類型占據的空間大小

byte 占位8個比特,或者說一個字節.由於是有符號的,所以最小時為-128,最大值為+127.

short 占位16比特,兩字節.最小值2^15,最大值2^15 -1.
int 占位32比特,4字節.最小值 2^31,最大值2^31 -1
long 占位64比特,8字節.最小值2^63,最大值2^63-1
float 占位32比特,4字節.最小正非零值2^-149,最大正非零值(2-2^-23)·2^127.
double 占64比特,8字節.最小正非零值為2^-1074,最大正非零值為(2-2^-52)·2^1023
char 占位16比特,2字節.主要是為了支持unicode,所以java中的char是雙字節,而非C++中的一個字節
boolean 網上說法比較多,不過根據字節碼的內容來看,如果是單個boolean變量,則使用int來存儲,如果是boolean數組,則用byte來存儲。

4. 註意與C/C++的不同

int 在C和C++的占用2個字節,在java中4個字節。
在C++中,char是基礎數據類型,8位,1個字節。byte不是基礎數據 類型,一般是typedef unsigned char byte;這樣子的,也就是說,byte其實是unsigned char類型,那麽也是8位,1個字節。不同的是,char可以表示的範圍是-128-127,而byte可以表示的範圍是0-255。
在java中,char和byte都是基礎數據類型,其中的byte和C++中的char類型是一樣的,8位,1個字節,-128-127。但是,char類型,是16位,2個字節,‘\u0000‘-‘\uFFFF‘,可以表示0~65535的無符號數。
為什麽java裏的char是2個字節?
因為java內部都是用unicode的,所以java其實是支持中文變量名的,比如string 世界 = "我的世界";這樣的語句是可以通過的。

5.邏輯運算符

邏輯運算符用於連接布爾型表達式。、
邏輯運算符包括"&","&&","|","||"。
&:表示普通與,所有的判斷條件都要依次執行;
&&:若幹個條件,如果前面的條件返回false,那麽後面不再判斷,就是false;
|:表示普通或,所有的判斷條件都要依次執行;
||:若幹個條件,如果前面的條件返回true,那麽後面不再判斷,就是true;

6.位運算符

位運算符主要針對二進制,
它包括了:按位與(&)、非(~)、按位或(|)、按位異或(^)。
從表面上看似乎有點像邏輯運算符,但邏輯運算符是針對兩個關系運算符來進行邏輯運算,而位運算符主要針對兩個二進制數的位進行邏輯運算。
&:當兩邊操作數對應的位同時是1時,結果為1,否則為0。如1100&1010=1000   
|:當兩邊操作數對應的位只要有一個是1,結果為1,否則為0。如1100|1010=1110   
~:操作數的位,0變1,1變0,這個是單目運算符  
^:當兩邊操作數對應的位值不同時,結果為1,否則為0。如1100^1010=0110

7.位移動運算符

位移動運算符主要有三種:
<<(左移):
在沒有溢出的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方
>>(帶符號右移):右移高位補符號位
右移一位相當於除2,右移n位相當於除以2的n次方。
>>>(無符號右移):右移高位補0,
無符號右移運算符只對32位和64位的值有意義

8.實例驗證

public static void main(String[] args) {
        // 1、左移( << )
        // 0000 0000 0000 0000 0000 0000 0000 0101 然後左移2位後,低位補0://
        // 0000 0000 0000 0000 0000 0000 0001 0100 換算成10進制為20
        System.out.println(5 << 2);// 運行結果是20
 
        // 2、右移( >> ) 高位補符號位
        // 0000 0000 0000 0000 0000 0000 0000 0101 然後右移2位,高位補0:
        // 0000 0000 0000 0000 0000 0000 0000 0001
        System.out.println(5 >> 2);// 運行結果是1
 
        // 3、無符號右移( >>> ) 高位補0
        // 例如 -5換算成二進制後為:0101 取反加1為1011
        // 1111 1111 1111 1111 1111 1111 1111 1011
        // 我們分別對5進行右移3位、 -5進行右移3位和無符號右移3位:
        System.out.println(5 >> 3);// 結果是0
        System.out.println(-5 >> 3);// 結果是-1
        System.out.println(-5 >>> 3);// 結果是536870911
 
        // 4、位與( & )
        // 位與:第一個操作數的的第n位於第二個操作數的第n位如果都是1,那麽結果的第n為也為1,否則為0
        System.out.println(5 & 3);// 結果為1
        System.out.println(4 & 1);// 結果為0
 
        // 5、位或( | )
        // 第一個操作數的的第n位於第二個操作數的第n位 只要有一個是1,那麽結果的第n為也為1,否則為0
        System.out.println(5 | 3);// 結果為7
 
        // 6、位異或( ^ )
        // 第一個操作數的的第n位於第二個操作數的第n位 相反,那麽結果的第n為也為1,否則為0
         System.out.println(5 ^ 3);//結果為6
 
        // 7、位非( ~ )
        // 操作數的第n位為1,那麽結果的第n位為0,反之。
        System.out.println(~5);// 結果為-6
    } 

【Java基礎】Java基本數據類型與位運算