占用字節數 & 取值范圍
Java一共有8種基本數據類型(原始數據類型):
類型 存儲要求 范圍(包含) 默認值 包裝類
int 4字節(32位) -2^31~ 2^31-1 0 Integer
short 2字節(16位) -215~215-1 0 Short
long 8字節(64位) -2^63~2^63-1 0 Long
byte 1字節(8位) -2^7~2^7-1 0 Byte
float 4字節(32位) -3.4e+38 ~ 3.4e+38 0.0f Float
double 8字節(64位) -1.7e+308 ~ 1.7e+308 0 Double
char 2字節(16位) u0000~uFFFF(‘’~‘?’) ‘0’ Character
boolean 1/8字節(1位) true, false FALSE Boolean
對於float與double類型:
內存結構:
- float類型: 內存中共占4個字節,32bit位,其中bit位從高到低,依次是1位符號位、8位指數位、23位尾數位;
- double類型:內存中共占8字節,64bit位,其中bit位從高到低,依次是1位符號位、11位指數位、52位尾數位;
精度:
精度由尾數的位數決定,在內存中按照科學計數法的方式存儲的。
關於比較是否相等:
- 兩個浮點數之間不能通過來比較是否相等,因為浮點數的精度是有限制的,超過精度限制的浮點數,計算機會將精度之外的小數部分截斷,如果直接比較的話,會出現兩個不一樣的值結果大小判斷卻相等的情況。
- 一般情況下,不要通過==或者!=來比較,可以通過判斷其差值的絕對值是否大於0來判斷。
- 實際應用中,一般兩個浮點數之間的差值的絕對值小於等於某一個可接受的誤差(即:精度,比如0.00000001),就認為是相同的。
實際應用原則:
- 程序中盡量避免浮點型數據的比較;
- float、double類型運算一般都不准確,只適合科學計算或者工程計算,不適用與商業計算。比如1.0f-0.9f=0.100000024
為了解決JAVA中浮點數精度不夠的問題,可以使用BigDecimal來替代,適用於對精度要求較高的系統中。
源碼 & 反碼 && 補碼##
源碼
源碼就是數字對應的二進制表示。
負數的源碼 = 正數的源碼取反再加1
反碼
正數的反碼就是源碼自身。
負數的反碼就是:保持源碼符號位不變,其余各個位取反。
補碼
正數的補碼就是源碼自身。
負數的補碼就是: 反碼基礎上加1
如何根據補碼計算源碼:
- 最高位如果是0,即為正數,其補碼即為源碼;
- 最高位如果是1,即為負數,對此補碼再次計算補碼,結果即為源碼(即:補碼的補碼即為源碼)。
為什么要有源碼、反碼、補碼
反碼、補碼存在主要是為了是計算機運算更加方便。
具體可以參見http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
運算符
根據參與運算的參數個數,可以分為下面幾種:
- 一元運算符:就是只需要一個參數的運算,比如++、--、~、!等;
- 二元運算符:就是需要2個參數的運算,比如+、-、*、>、<等;
- 三元運算符:就是需要3個參數的運算,比如?:運算符(isTrue ? A : B)。
位運算相關
JAVA中的位運算符有下面幾種:
- 左移(<<)、右移(>>)、無符號右移(>>>)
- 位與(&)、位或(|)、位非(~)、位異或(^)
1. 位與####
參加運算的兩個數據,按二進制位進行位與運算.
例如:3&5
- 先將兩個數據轉化為二進制數,然后按位進行與運算,同為1結果為1,其它情況結果為0;
- 即:11&101=001結果為1
特別提醒:負數按補碼形式參加按位與運算。
位與運算的特殊用途:
- 清零(將一個單元與0進行位與運算結果為零)
- 取一個數中指定位(例如取X=1010 1101的低四位 則將X&00001111得到0000 1101)。
2. 位或####
參加運算的兩個數據,按二進制位進行位或運算
例如:3 | 5
- 先將兩個數據轉化為二進制數,然后進行按位或運算,只要有一個是1結果為1,不然結果為0;
- 即:11&101=111結果為7
特別提醒:負數按補碼形式參加按位或運算。
位或運算的特殊用途:
常用來對數據的某些位置1(例如將X=1010 1010的第四位置1,則將X |0000 1111得到1010 1111)。
3. 位非####
快速計算結果的方法:
a的值為-(a+1)。比如2=-3,~(-2)=1
具體計算說明:
位非操作實際上是對計算機的補碼進行操作的。 即:先源碼轉補碼,然后對補碼進行逐位取反,最后再將處理后的補碼轉回源碼。
- 根據二進制源碼獲取其補碼;
- 對補碼進行按位取反;
- 將計算后的補碼轉換回源碼。
對於正整數,其補碼與源碼相同,對於負數,其補碼位源碼的取反再加一。
4. 位異或####
參加運算的兩個數據,按二進制位進行位異或運算
例如:3^5
- 先將兩個數據轉化為二進制數,然后進行按位異或運算,只要位不同結果為1,不然結果為0;
- 即:11^101=110結果為6
異或運算的特殊用途:
- 使特定位翻轉找一個數,對應X要翻轉的各位,該數的對應位為1,其余位為零,此數與X對應位異或即可。例:X=10101110,使X低4位翻轉,用X ^0000 1111 = 1010 0001即可得到。
- 與0異或得到原值
