Java中八进制以单个0开头(如012)、十六进制以0x/0X开头(如0xFF),均需严格遵循语法:八进制仅含0–7,十六进制含0–9/a–f;无前缀则按十进制处理,易出错。

Java 中八进制和十六进制数字用特定前缀表示,不加前缀会被当作十进制处理,容易出错。
八进制:必须以 0 开头(数字零),后面只能是 0–7
Java 用单个 0(不是 0o 或 0O)标识八进制字面量。注意:这不是“零开头的任意数”,而是语法强制要求。
-
合法写法:int x = 012; // 等于十进制 10(1×8¹ + 2×8⁰)
int y = 0777; // 等于十进制 511
int z = 0; // 八进制 0 是允许的,值就是 0 -
非法写法:int a = 08; // 含数字 8,编译报错
int b = 092; // 含 9,同样报错
int c = 123; // 没有前缀 0,按十进制解释
十六进制:必须以 0x 或 0X 开头,后接 0–9、a–f(大小写不敏感)
0x 中的 0 是数字零,x 是字母 x(不是乘号或零),大小写均可,但推荐统一用小写 x 或大写 X 保持可读性。
-
合法写法:int h1 = 0xFF; // 十进制 255
long h2 = 0XdeadC0deL; // 支持大小混写 + L 后缀
short s = 0x00FF; // 值在 short 范围内即可 -
非法写法:int a = 0xfg; // g 不是有效十六进制字符
int b = x1A; // 缺少前导 0
int c = 0X; // 没有后续数字,语法错误
类型与后缀要注意
所有这些字面量默认是 int 类型。超出 int 范围(±2³¹)时必须显式指定 long,加 L(推荐大写,避免和 1 混淆);赋给 byte、short 需确保值在范围内,否则需强制转换。
- long big = 0xFFFFFFFFFFFFFFFFL; // 正确
- long bad = 0xFFFFFFFFFFFFFFFF; // 编译失败:超 int 范围且无 L
- byte b = 0b0000_0001; // 可以,值为 1,在 byte 范围内
- byte c = 0xFF; // 编译通过(0xFF = 255),但 255 超出 byte(-128~127),实际会隐式截断为 -1 —— 需谨慎
小技巧:下划线提升可读性
Java 7 起支持在数字字面量中用下划线分隔,不影响数值,只增强人眼识别:
- int mask = 0b1111_0000_1010_1100;
- int addr = 0xFF_FF_FF_FF;
- int oct = 0_777_123; // 八进制也支持
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











