Java自JDK 7起支持0x/0X十六进制(如0xFF=255)和0b/0B二进制(如0b1100=12)字面量,支持下划线分隔;八进制以0开头(如010=8),但易出错且不推荐;字面量默认int型,超范围需加L等后缀。

Java里怎么写十六进制和二进制字面量
Java从JDK 7起正式支持0x(或0X)表示十六进制、0b(或0B)表示二进制,这是编译器直接识别的语法,不是字符串也不是运行时转换。
-
0x后面跟0–9、a–f(不区分大小写),比如0xFF= 255,0x1a= 26 -
0b后面只能是0和1,比如0b1100= 12,0b1010_1010(带下划线)= 170(JDK 7+支持下划线分隔,提升可读性) - 十进制仍是默认形式,不用前缀;八进制以
0开头(如017),但已不推荐——容易误读,且08、09会直接编译报错
为什么010不等于10,而等于8
因为以0开头的整数字面量在Java中被解析为八进制,不是“加了个前导零”那么简单——这是词法解析阶段就确定的进制含义。
-
010→ 八进制10 →1×8¹ + 0×8⁰ = 8 -
0123→ 八进制123 →1×8² + 2×8¹ + 3×8⁰ = 64 + 16 + 3 = 83 - 一旦含非法八进制字符(如
08、09),编译器报错:Invalid octal literal - 负号是作用在最终值上的,
-0x10是-16,不是“负十六进制”,十六进制字面量本身只表示非负整数
什么时候该用二进制/十六进制字面量
不是为了炫技,而是当语义天然对应位操作或协议规范时,用对进制能显著降低理解成本和出错概率。
- 位掩码定义:用
0b1000_0000比128更直观表达“最高位为1” - 网络协议/硬件寄存器:字段常按bit位定义,比如SPI控制字
0b0000_0101比5更能体现bit2和bit0置位 - 颜色值:Android中
0xFF00FF00一眼看出ARGB,比4278255360可靠得多 - 避免用八进制表示权限(如Linux的
0755),虽然语法合法,但团队协作中极易引发歧义,建议改用十进制或注释说明
常见错误和兼容性注意点
这些坑不报红,但结果不对,而且很难一眼发现。
立即学习“Java免费学习笔记(深入)”;
- JDK 6及更早版本不支持
0b,用会编译失败;JDK 7+才支持,生产环境需确认JRE版本 - 十六进制字母不区分大小写,但
0xdeadbeef和0xDEADBEEF风格建议统一,避免混用 - 别把字符串当成字面量:
"0xFF"是String,不是int;要转数值得用Integer.parseInt("FF", 16) - 字面量默认是
int类型,超范围要加后缀:0xFFFFFFFFL(long),否则编译报错integer number too large










