Java 基本類型中 byte、short、int、long 皆為有符號整數,採用二進制補碼形式存儲。理解其存儲規則、取值範圍及轉換規則,是寫出高效、無 Bug 代碼的基石。
| 類型 | 位數 | 包裝類 | 最小值 | 最大值 |
|---|---|---|---|---|
byte | 8 | Byte | -128 (-2⁷) | 127 (2⁷-1) |
short | 16 | Short | -32,768 (-2¹⁵) | 32,767 (2¹⁵-1) |
int | 32 | Integer | -2,147,483,648 (-2³¹) | 2,147,483,647 (2³¹-1) |
long | 64 | Long | -9,223,372,036,854,775,808 (-2⁶³) | 9,223,372,036,854,775,807 (2⁶³-1) |
原碼、反碼、補碼完全相同。
例:+10 → 0000 0000 0000 1010
例:-10(short)
原碼:1000 0000 0000 1010
反碼:1111 1111 1111 0101
補碼:1111 1111 1111 0110 ← 內存實際存儲
-1:補碼全 1 → 1111 1111 1111 1111-32,768(最小值):1000 0000 0000 0000(無對應正數)0:0000 0000 0000 0000(唯一表示)short 範圍:-32,768 ~ 32,767
32,767 + 1 → 溢出為 -32,768(0111...111 + 1 = 1000...000)
-32,768 - 1 → 溢出為 32,767(1000...000 - 1 = 0111...111)
本質:模 2ⁿ 運算,數值在環狀空間循環。
「容量小」→「容量大」:
byte/short/char → int → long → float → double
int 以上byte b = 3; b = (byte)(b * 3); 必須強轉char → int 取 Unicode 碼值(如 'c' → 99)int n = (int) 3.14159; // 截斷小數
long l = 100L; int i = (int) l; // 可能溢出丟失高位
⚠️ int → float、long → float/double 可能損失精度(非溢出)。
// 基本類型 → 包裝類(自動裝箱)
Integer iObj = 100;
// 包裝類 → 基本類型(自動拆箱)
int iPrim = iObj;
// 跨類型轉換
double d = new Float(3.14f).doubleValue();
int i = Double.valueOf("3.14").intValue(); // 3
| 方向 | 方法 | 示例 |
|---|---|---|
| 其他 → String | toString()、+ ""、String.valueOf() | String s = 123 + ""; |
| String → 基本類型 | parseXxx()、valueOf().xxxValue() | int i = Integer.parseInt("123"); |
long ↔ Date:毫秒時間戳 date.getTime() / new Date(millis)int → Date:構造函數 new Date(year, month, date...)(已過時,建議用 Calendar/LocalDateTime)SimpleDateFormat / DateTimeFormatter (Java 8+)Integer obj = null; int i = obj; → 拋出 NullPointerExceptionlong l = 2147483648L; 必須加 L,否則編譯報錯(超出 int 範圍)float/double,改用 BigDecimal 或「分為單位的 long」>> 帶符號右移,>>> 無符號右移(補 0),負數行為不同Java 整數以補碼存儲、定長有符號、溢出環狀、表達式自動提升為 int。牢記「小→大自動、大→小強轉、浮點慎轉整、字符串用 parse」口訣,配合包裝類緩存機制(-128~127),即可駕馭 99% 數值計算場景。