在写代码的时候,我注意到long(primitive)数据类型不需要后缀l或L,我的代码编译后运行正常。谁能解释一下这背后的逻辑?先谢谢你了...
long l=435; //Complies and Run fine
当你这样做时。
long l=435;
编译器认为它是一个 int
,然后,由于你给的数据类型是一个 long
所以,它确实 自动转换 到 long
数据类型。所以你不需要后缀。
然而,如果你用一个很长的数字来尝试,比如。
long l = 9999999999;
编译器会抛出一个错误(过大). 因为,它会试图将其视为一个。int
但它太大,不可能是一个 int
. 所以,在这里,你需要一个后缀。如果你这样做,
long l = 9999999999L;
那么它就会被编译。简单的说,一个只能装在 long
数据类型。
因为int类型可以自动转换为long。
试着给一个真正的bug号,如 long l = 0xFFFFFFFFF;
.
当你初始化一个像0xFFFFFFFFF这样的文字时,如果没有后缀,而且变量是一个积分类型(int,long等),那么这个值被认为是一个 int
. 而且,一个 int
可以容纳32位,而不是36位(9 x 1)。0xF
= 9 x '1111'
),就像你输入 long l = 0xFFFFFFFFF;
. 所以,你必须使用一个 long
的容量为64位。在值的末尾添加'L'或'l',比如0xFFFFFFFFFL,应该可以解决编译器的错误。[参考资料]
一般情况下,由于类型转换为long的过程还是会发生,所以最好是明确地说明这一点 L
.