首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 整數類型存儲機制深度解析:補碼、範圍與類型轉換

     編輯:Java 相關知識

前言

Java 基本類型中 byte、short、int、long 皆為有符號整數,採用二進制補碼形式存儲。理解其存儲規則、取值範圍及轉換規則,是寫出高效、無 Bug 代碼的基石。

一、四大整數類型對照表

類型位數包裝類最小值最大值
byte8Byte-128 (-2⁷)127 (2⁷-1)
short16Short-32,768 (-2¹⁵)32,767 (2¹⁵-1)
int32Integer-2,147,483,648 (-2³¹)2,147,483,647 (2³¹-1)
long64Long-9,223,372,036,854,775,808 (-2⁶³)9,223,372,036,854,775,807 (2⁶³-1)

二、補碼存儲原理(以 short 為例)

1. 符號位與數值位

  • 最高位(第 15 位)為符號位:0=正,1=負
  • 其餘 15 位為數值位

2. 正數存儲

原碼、反碼、補碼完全相同。
例:+10 → 0000 0000 0000 1010

3. 負數存儲(關鍵)

  1. 寫出絕對值原碼(符號位為 1)
  2. 符號位不變,數值位按位取反得反碼
  3. 反碼+1得補碼(機器內真實存儲形式)

例:-10(short)
原碼:1000 0000 0000 1010
反碼:1111 1111 1111 0101
補碼:1111 1111 1111 0110 ← 內存實際存儲

4. 特殊值驗證

  • -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ⁿ 運算,數值在環狀空間循環。

四、類型轉換完整規則

1. 自動類型提升(隱式轉換)

「容量小」→「容量大」:
byte/short/char → int → long → float → double

  • 表達式中自動提升為 int 以上
  • byte b = 3; b = (byte)(b * 3); 必須強轉
  • char → int 取 Unicode 碼值(如 'c' → 99)

2. 強制類型轉換(窄化)

int n = (int) 3.14159; // 截斷小數
long l = 100L; int i = (int) l; // 可能溢出丟失高位

⚠️ int → float、long → float/double 可能損失精度(非溢出)。

3. 包裝類轉換

// 基本類型 → 包裝類(自動裝箱)
Integer iObj = 100; 
// 包裝類 → 基本類型(自動拆箱)
int iPrim = iObj; 
// 跨類型轉換
double d = new Float(3.14f).doubleValue();
int i = Double.valueOf("3.14").intValue(); // 3

4. 字符串互轉

方向方法示例
其他 → StringtoString()、+ ""、String.valueOf()String s = 123 + "";
String → 基本類型parseXxx()、valueOf().xxxValue()int i = Integer.parseInt("123");

5. Date 與數值互轉

  • long ↔ Date:毫秒時間戳 date.getTime() / new Date(millis)
  • int → Date:構造函數 new Date(year, month, date...)(已過時,建議用 Calendar/LocalDateTime)
  • 格式化:SimpleDateFormat / DateTimeFormatter (Java 8+)

五、避坑指南

  1. 自動拆箱 NPE:Integer obj = null; int i = obj; → 拋出 NullPointerException
  2. 長整數字面值:long l = 2147483648L; 必須加 L,否則編譯報錯(超出 int 範圍)
  3. 浮點精度:金額計算嚴禁用 float/double,改用 BigDecimal 或「分為單位的 long」
  4. 移位運算:>> 帶符號右移,>>> 無符號右移(補 0),負數行為不同

結語

Java 整數以補碼存儲、定長有符號、溢出環狀、表達式自動提升為 int。牢記「小→大自動、大→小強轉、浮點慎轉整、字符串用 parse」口訣,配合包裝類緩存機制(-128~127),即可駕馭 99% 數值計算場景。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved