java中八进制字面量以0开头、仅含0–7,十六进制以0x/0x开头、含0–9/a–f;二者均默认int型,超范围需加l后缀,非法字符或前缀错误将导致编译失败。

Java 中八进制和十六进制字面量必须严格按语法规则书写,否则编译直接失败。关键不是“怎么写好看”,而是“怎么写才合法”——前缀、字符范围、类型处理三者缺一不可。
八进制字面量:以单个 0 开头,只含 0–7
Java 把任何以 0(零)开头 的整数字面量都当作八进制解析,不是 0o 或 0O(那是 Python 的写法)。它不支持前缀显式标识,全靠这个前导零触发词法识别。
- 合法写法:
int x = 012;→ 八进制 12 = 1×8 + 2 = 十进制 10 - 合法写法:
int y = 0;或00→ 都是十进制 0(八进制中 0 是唯一允许的“全零”形式) - 非法写法:
08、09、018→ 含数字 8 或 9,超出八进制字符集,编译报错 Invalid octal literal - 注意:
010不等于十进制 10,而是八进制 10 = 8;容易误读,团队协作中不推荐使用
十六进制字面量:以 0x 或 0X 开头,后接 0–9 和 a–f(大小写不敏感)
这是最常用也最安全的非十进制表示方式,语法清晰、容错性好,广泛用于位掩码、颜色值、协议字段等场景。
- 合法写法:
int h1 = 0xFF;→ 十六进制 FF = 255 - 合法写法:
long h2 = 0XdeadC0deL;→ 支持大小写混用,L 后缀声明为 long - 合法写法:
short s = 0x00FF;→ 值在 short 范围内,可直接赋值 - 非法写法:
0xG1、0x12z→ 含 g、z 等非法字符,编译失败 - 负号作用于整个值:
-0x10表示 -16,不是“负十六进制”概念
通用规则与避坑要点
无论八进制还是十六进制,都共享几条底层约束,写错一个就编译不过:
- 整数字面量默认是 int 类型;若值超过 int 范围(±2³¹),必须加 L 后缀(如
0xFFFFFFFFFFFFFFFFL),否则报错 - 支持下划线分隔符(JDK 7+),提升长字面量可读性:
0xFF_FF_FF_FF、0b1100_1010都合法,但不能开头、结尾或连续出现 - 八进制已不推荐使用——易与十进制混淆(如
010vs10),且08这类写法会静默报错;现代开发优先选0x或0b - 所有进制字面量都表示非负整数;符号(+/-)是单独的一元运算符,不在字面量内部
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











