一個字節包含8位, 第一位是符號位, 8位就可以是代碼27次方, 所以范圍為-2^7 ~ 2^7 - 1, 即-128到+127;
一個字節包含8位,八位轉化為二進制位11111111,此時的值為FF,或者00000000,值為00; 其中十進制的0-127也就是十六進制的00-7E,代表了ascll的英文碼表,就是說英文只要一個字節就能夠表示清楚....
各種數據類型:
byte類型就是1個字節,能夠代表的范圍為-2^7 ~ 2^7 - 1;
short類型為2個字節,能夠代表的范圍為-2^16 ~ 2^16 - 1;
int類型為4個字節,能夠代表的范圍為-2^31 ~ 2^31 - 1;
long類型為8個字節,能夠代表的范圍為-2^64 ~ 2^64 - 1;
flaot的類型也為4字節, 但是它的范圍比int大得多(來自百度知道:位符號位+8位指數(q)+23位底數(b),其解釋出來的形式是:b^q,由于指數q是8位有符號整數,范圍是-128 ~ 127,23位的底數(無符號)最大值就是2 ^ 23,算上指數的話,最大可以表達到2 ^ 23 ^ 127,但是由于計算機的運算能力限制,并不能處理到如此大的數,但是其取值范圍也會比32位整數大很多。 由于float類型是一個冪計算式,所以很多時候并不能表達一個精確值,例如0.1,如果使用float在內存中會被表示為0.10000000000000001,如果進行反復計算將會導致非常大的誤);
double類型也為8個字節;
移位運算, 有符號左移"<<":
public class Test { public static void main(String args[]) { System.out.println( 10<<1 ); //相當于: 10*2 System.out.println( 10<<2 ); //相當于:10*2^2 System.out.println( 10<<3 ); //相當于:10*2^3 System.out.println( 10<<4 ); //相當于:10*2^4 } }
//輸出:
20
40
80
160
有符號右移動">>":
public class Test { public static void main(String args[]) { int num = 160; System.out.println( num>>1 ); System.out.println( num>>2 ); System.out.println( num>>3 ); System.out.println( num>>4 ); } }
//輸出: 80 40 20 10
>>>:無符號右移,忽略符號位,空位都以0補齊;
無符號右移有個特性必須記住,因為在二進制中:負數的值正數的取反+1 ,當我們對一個負數進行無符號右移, 那么無符號右移的值將會非常大:
public class Test { public static void main(String args[]) { int num = -1; System.out.println( num>>>1 ); } }
//輸出:2147483647
~:按位取反;
&:按位且;
|:按位或;
^:按位異或;
但是這些玩意兒有什么用呢, 參考如下的js代碼, 原文鏈接:
(!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
會輸出:"sb"
或者這樣裝逼...
((""[~+[]]++)+"")[(+[])]+(!+[]+{})[(~((~+[]+~+[])<<(-(~+[]))))]
會輸出:"Ne"
進制之間的轉化參考, 進制參考:
10進制到2進制:
2進制到10進制:
文章列表