10. Java 详解整数字面量
在 Java 中,整数字面量(Integer Literals) 是直接在代码中表示整数值的方式。Java 支持四种进制的整数:
-
十进制(Decimal) →
10
-
十六进制(Hexadecimal) →
0xA
-
二进制(Binary) →
0b1010
-
八进制(Octal,已过时) →
012
(不推荐使用)
此外: ✅ 默认情况下,整数类型是 int
,除非加 L
变为 long
。
✅ Java 7+ 允许使用 _
作为分隔符,提高可读性。
1️⃣ Java 整数字面量的 4 种进制表示
✅ 十进制(Decimal,默认)
- 默认情况下,整数是十进制(Base 10)
int decimalValue = 26;
System.out.println(decimalValue); // 输出 26
✅ 十六进制(Hexadecimal)
- 以
0x
或0X
开头,数字范围是0-9
和A-F
(不区分大小写)
int hexValue = 0x1A; // 1A = 26
int hexLowerCase = 0x1a;
System.out.println(hexValue); // 输出 26
✅ 二进制(Binary,Java 7+ 支持)
- 以
0b
或0B
开头,数字范围0
和1
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️⃣ int
和 long
类型的区别
默认情况下,整数是 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
⚠ 下划线不能放在开头、结尾或 0x
、0b
后
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️⃣ Integer
和 Long
类的无符号支持(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)
→int
转long
-
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 |
一般整数 |
十六进制 |
0x 或 0X
|
0x1A |
0-9 , A-F (16 进制) |
二进制(Java 7+) |
0b 或 0B
|
0b1010 |
0 和 1
|
八进制(不推荐) | 0 |
0123 |
0 -7
|
✅ 最佳实践
- 默认用
int
,超出范围用long
(加L
) -
使用
_
分隔符提高可读性(如1_000_000
) - 不要使用八进制,容易混淆
- 大数计算用
BigInteger
🚀 希望这个讲解能帮你彻底理解 Java 整数字面量! 🎯