Java中声明long类型时省略l/L后缀的影响与变量类型判定
Java long类型省略l/L后缀的实际规则
核心问题解答
针对对应测试代码里的两个疑问,结合Java语言规范的实际行为说明如下:
1. l3 变量的类型归属
l3 变量的实际类型是 long,不存在是int类型的情况。
Java中变量的类型由声明语句直接决定,和赋值表达式的自身类型没有关系。这里只是赋值右侧的100这个不带后缀的整数字面量,本身的默认类型是int,而非long。
2. 省略l/L后缀的执行效果
省略后缀的执行结果分两种场景,完全取决于不带后缀的整数值是否落在int类型的取值范围内(即-2³¹ ~ 2³¹-1):
- 当整数值在int合法取值范围内(比如示例中的100):Java会执行隐式自动类型转换,把原本int类型的数值转换为long类型后再完成赋值。整个过程编译无报错、运行无异常,和加了L后缀的执行结果没有实际区别。
- 当整数值超出int的合法取值范围:哪怕把这个值赋值给long类型的变量,也会直接触发编译报错。因为不带后缀的整数会首先被按int类型做语法解析,超出int范围的数值根本无法通过解析校验,完全走不到后续转换为long的步骤。比如写
long bigValue = 9999999999;这行代码,因为数值超出int范围又没加L后缀,编译器会直接抛出“integer number too large”的编译错误。
补充说明
- 日常编码中更推荐使用大写
L作为后缀,避免小写l和数字1视觉混淆,比如100l很容易被误看成1001,降低代码可读性。 - 对应测试代码的实际编译表现:
long l1 = 100l; // 右侧字面量为long类型,无隐式转换 long l2 = 100L; // 右侧字面量为long类型,无隐式转换 long l3 = 100; // 右侧字面量为int类型,自动转long后赋值,编译通过
内容的提问来源于stack exchange,提问作者mrbela
相关产品推荐
相关产品推荐

