10. Java 详解整数字面量

15 阅读4分钟

10. Java 详解整数字面量

在 Java 中,整数字面量(Integer Literals) 是直接在代码中表示整数值的方式。Java 支持四种进制的整数:

  1. 十进制(Decimal)10
  2. 十六进制(Hexadecimal)0xA
  3. 二进制(Binary)0b1010
  4. 八进制(Octal,已过时)012(不推荐使用)

此外: ✅ 默认情况下,整数类型是 int,除非加 L 变为 long。 ✅ Java 7+ 允许使用 _ 作为分隔符,提高可读性。


1️⃣ Java 整数字面量的 4 种进制表示

✅ 十进制(Decimal,默认)

  • 默认情况下,整数是十进制(Base 10)
int decimalValue = 26;
System.out.println(decimalValue);  // 输出 26

✅ 十六进制(Hexadecimal)

  • 0x0X 开头,数字范围是 0-9A-F(不区分大小写)
int hexValue = 0x1A;   // 1A = 26
int hexLowerCase = 0x1a;
System.out.println(hexValue);  // 输出 26

✅ 二进制(Binary,Java 7+ 支持)

  • 0b0B 开头,数字范围 01
int binaryValue = 0b11010;  // 11010(二进制)= 26(十进制)
System.out.println(binaryValue);  // 输出 26

✅ 八进制(Octal,不推荐)

  • 0(零)开头,数字范围 0-7
  • 容易混淆,不建议使用
int octalValue = 032;  // 032 = 3×8^1 + 2×8^0 = 26
System.out.println(octalValue);  // 输出 26

注意:避免误用八进制

int misleading = 09; // ❌ 错误!9 不是八进制数字

💡 现代 Java 编程很少使用八进制,建议使用 0x(十六进制)或 0b(二进制)代替。


2️⃣ intlong 类型的区别

默认情况下,整数是 int 类型。如果超出 int 的范围(-2³¹ ~ 2³¹-1),则必须使用 long 并加 L(建议大写 L 以避免混淆)。

long largeNumber = 9223372036854775807L;  // ✅ 使用 L 表示 long
int smallNumber = 100000;  // ✅ 默认是 int

错误示例

long error = 9223372036854775807;  // ❌ 编译错误,没有 `L`

3️⃣ 使用 _ 作为分隔符(Java 7+

Java 7 允许在数字字面量中使用 _ 分隔符,提高可读性:

int million = 1_000_000;
long creditCard = 1234_5678_9012_3456L;
System.out.println(million);  // 输出 1000000

下划线不能放在开头、结尾或 0x0b

int error = _1000;   // ❌ 错误,不能放在开头
int error2 = 1000_;  // ❌ 错误,不能放在结尾
int hexError = 0x_1A; // ❌ 错误,不能放在 `0x` 后

4️⃣ 进制转换

十进制 ↔ 其他进制转换

int decimal = 26;
String binaryStr = Integer.toBinaryString(decimal);  // 26 → "11010"
String hexStr = Integer.toHexString(decimal);        // 26 → "1a"
String octalStr = Integer.toOctalString(decimal);    // 26 → "32"

System.out.println(binaryStr);  // 输出 "11010"
System.out.println(hexStr);     // 输出 "1a"
System.out.println(octalStr);   // 输出 "32"

不同进制字符串转换为整数

int binary = Integer.parseInt("11010", 2);  // "11010" → 26
int hex = Integer.parseInt("1A", 16);       // "1A" → 26
int octal = Integer.parseInt("32", 8);      // "32" → 26

System.out.println(binary);  // 输出 26
System.out.println(hex);     // 输出 26
System.out.println(octal);   // 输出 26

5️⃣ IntegerLong 类的无符号支持(Java 8+)

Java 8+ 增加了 无符号整数支持,用于处理无符号数据:

int unsignedInt = Integer.parseUnsignedInt("4294967295");  // 2³²-1
long unsignedLong = Long.parseUnsignedLong("18446744073709551615"); // 2⁶⁴-1
  • Integer.compareUnsigned(int x, int y) → 无符号比较
  • Long.compareUnsigned(long x, long y) → 无符号比较
  • Integer.toUnsignedLong(int x)intlong
  • Long.divideUnsigned(long x, long y) → 无符号除法

6️⃣ 整数溢出(Integer Overflow)

如果 int 超过 2³¹-1,会发生溢出:

int max = Integer.MAX_VALUE;  // 2147483647
int overflow = max + 1;
System.out.println(overflow);  // ❌ 输出 -2147483648(溢出)

解决方案

  • 使用 long 存储大数
  • 使用 BigInteger 进行超大数计算
import java.math.BigInteger;

BigInteger big = new BigInteger("92233720368547758070");
BigInteger sum = big.add(new BigInteger("1"));
System.out.println(sum);  // ✅ 正确计算

🔹 结论

进制前缀示例说明
十进制(默认)100一般整数
十六进制0x0X0x1A0-9, A-F16 进制)
二进制(Java 7+)0b0B0b101001
八进制(不推荐)001230-7

最佳实践

  • 默认用 int,超出范围用 long(加 L
  • 使用 _ 分隔符提高可读性(如 1_000_000
  • 不要使用八进制,容易混淆
  • 大数计算用 BigInteger

🚀 希望这个讲解能帮你彻底理解 Java 整数字面量! 🎯