【Java 溫故而知新系列】基礎(chǔ)知識(shí)-02 數(shù)據(jù)基本類型
1、Java基本數(shù)據(jù)類型
Java語言是強(qiáng)類型語言,對(duì)于每一種數(shù)據(jù)都定義了明確的具體的數(shù)據(jù)類型,在內(nèi)存中分配了不同大小的內(nèi)存空間。
基本數(shù)據(jù)類型
- 數(shù)值型:整數(shù)類型(byte,short,int,long) ;浮點(diǎn)類型(float,double)
- 字符型:char
- 布爾型:boolean
| 類型 | 類型名稱 | 關(guān)鍵字 | 占用內(nèi)存 | 取值范圍 | 默認(rèn)值 |
| 整型 | 字節(jié)型 | byte | 1 Byte(字節(jié)) |
-128(2^7) ~ 127(2^7-1) |
0 |
| 短整型 | short | 2 Byte(字節(jié)) |
-32768(2^15) ~ 32767(2^15-1) |
0 | |
| 整型 | int | 4 Byte(字節(jié)) |
-2147483648(2^31) ~ 2147483647(2^31-1) |
0 | |
| 長(zhǎng)整型 | long | 8 Byte(字節(jié)) | -2^63 ~2^63-1 | 0L | |
| 浮點(diǎn)型 | 單精度浮點(diǎn)型 | float | 4 Byte(字節(jié)) |
-3.4028235 × 10^38 ~ 3.4028235×10^38 |
0.0F |
| 雙精度浮點(diǎn)型 | double | 8 Byte(字節(jié)) |
?1.7976931348623157×10^308 ~ 1.7976931348623157×10^308 |
0.0D | |
| 字符型 | 字符型 | char | 2 Byte(字節(jié)) | 表示一個(gè)字符,如'a'、'A' | '\u0000' |
| 布爾型 | 布爾型 | boolean | 1 Byte(字節(jié)) | true、false | false |
很長(zhǎng)一段時(shí)間里對(duì)整型數(shù)據(jù)的取值范圍我自己一直幾個(gè)疑問 ,以byte 舉例:byte的取值范圍是 -128 (2^7)~ 127(2^7-1):
1、那么byte的內(nèi)存是 1 字節(jié)剛好是8位,它的取值范圍為什么是2^7而不是2^8呢 ???
2、最小值是-2^7,為什么最大值是2^7-1而不是 2^7呢 ???
有沒有跟我一樣的小伙伴 ? O(∩_∩)O哈哈~ 咋們接著往下看,看我細(xì)細(xì)道來!??!
疑問1:
因?yàn)?byte 是有符號(hào)整型,需要表示正數(shù)、負(fù)數(shù)以及零,所以需要用一位來表示符號(hào),最高位被用作符號(hào)位,所以最終表示數(shù)字范圍只能是2^7 而不是2^8。
- 如果最高位(最左邊的一位)是0,則該數(shù)為正數(shù)或零。
- 如果最高位是1,則該數(shù)為負(fù)數(shù)。
個(gè)人覺得第一個(gè)疑問還是比較好理解的,有符號(hào)位嘛,占一位所以少了一位。
疑問2:
最大值:最高位被用作符號(hào)位,因此當(dāng)這7個(gè)位全部為1且符號(hào)位為0時(shí)得到的就是最大正值(二進(jìn)制: 01111111),而二進(jìn)制 01111111 轉(zhuǎn)換為十進(jìn)制的值就是127,所以byte最大值剛好就是 2^7-1;
最小值:對(duì)于最小的負(fù)數(shù) -128,這是因?yàn)樵诙M(jìn)制補(bǔ)碼中,所有8位都是1(即 11111111)表示的是 -1。而當(dāng)只有最高位為1,其余位都為0(即 10000000)時(shí),根據(jù)二進(jìn)制補(bǔ)碼規(guī)則,這個(gè)值代表的是 -2^7 = -128。
到此我的2個(gè)疑問就都解開了, 不知道有沒有解開小伙伴你們的疑問呢?反思一下有這個(gè)疑問的根本原因是沒搞明白二進(jìn)制的補(bǔ)碼規(guī)則。歡迎大家進(jìn)行探討哈。
下面是網(wǎng)上搜羅的補(bǔ)碼規(guī)則以及設(shè)計(jì)出補(bǔ)碼的原因,僅供我自己和大家參考:
二進(jìn)制補(bǔ)碼規(guī)則:
1. 正數(shù)的補(bǔ)碼
對(duì)于正數(shù),其補(bǔ)碼就是它自身的二進(jìn)制表示。例如,十進(jìn)制數(shù) 5 的8位二進(jìn)制表示為 00000101,這也是它的補(bǔ)碼表示。
2. 負(fù)數(shù)的補(bǔ)碼
要獲得一個(gè)負(fù)數(shù)的補(bǔ)碼表示,可以按照以下步驟操作:
- 找到對(duì)應(yīng)的正數(shù):先確定該負(fù)數(shù)絕對(duì)值的二進(jìn)制表示。
- 取反:將上述二進(jìn)制數(shù)中的每一位取反(即將所有的 0 變成 1,所有的 1 變成 0),這一步也稱為一的補(bǔ)碼(One's Complement)。
- 加1:在取反后的結(jié)果上加 1,得到的就是該負(fù)數(shù)的二進(jìn)制補(bǔ)碼表示。
3. 補(bǔ)碼的優(yōu)點(diǎn)
- 簡(jiǎn)化了加法器的設(shè)計(jì):無論是正數(shù)還是負(fù)數(shù),都可以用同一個(gè)硬件電路來進(jìn)行加法運(yùn)算。
- 消除了正零和負(fù)零的區(qū)別:在補(bǔ)碼系統(tǒng)中,只有唯一的一個(gè)零(所有位均為 0),而不存在兩個(gè)不同的零。
- 自動(dòng)處理溢出:當(dāng)發(fā)生溢出時(shí),只要忽略最左邊的進(jìn)位位,結(jié)果仍然是正確的。
2、運(yùn)算
Java 不能隱式執(zhí)行向下轉(zhuǎn)型,因?yàn)檫@會(huì)使得精度降低。
1.1 字面量屬于 double 類型,不能直接將 1.1 直接賦值給 float 變量,因?yàn)檫@是向下轉(zhuǎn)型。
// float f = 1.1;
在代碼中輸入 float f = 1.1; 會(huì)得到如下清晰的提示

1.1f 字面量才是 float 類型。
1 float f = 1.1f;
隱式類型轉(zhuǎn)換
因?yàn)樽置媪?1 是 int 類型,它比 short 類型精度要高,因此不能隱式地將 int 類型向下轉(zhuǎn)型為 short 類型。對(duì)于 short s = 1; s = s + 1;由于 1 是 int 類型,因此 s+1 運(yùn)算結(jié)果也是 int型,需要強(qiáng)制轉(zhuǎn)換類型才能賦值給 short 型
short s = 1; // s = s + 1;
在代碼中輸入s = s + 1; 會(huì)得到如下清晰的提示

但是使用 += 或者 ++ 運(yùn)算符會(huì)執(zhí)行隱式類型轉(zhuǎn)換。
1 s += 1; 2 s++;
上面的語句相當(dāng)于將 s + 1 的計(jì)算結(jié)果進(jìn)行了向下轉(zhuǎn)型:
1 s = (short) (s + 1);
1 String temp = "a"; 2 switch (temp) { 3 case "a": 4 System.out.println("aaa"); 5 break; 6 case "b": 7 System.out.println("bbb"); 8 break; 9 }
switch 不支持 long、float、double,是因?yàn)?switch 的設(shè)計(jì)初衷是對(duì)那些只有少數(shù)幾個(gè)值的類型進(jìn)行等值判斷,如果值過于復(fù)雜,那么還是用 if 比較合適。
當(dāng)switch(expr) 中的expr 是long 類型時(shí),會(huì)得到如下清晰的提示


浙公網(wǎng)安備 33010602011771號(hào)