为什么Java整数文字的默认类型是int而不是long?

Cam*_*sen 14 java integer literals

我很困惑为什么Java整数文字默认int代替long.这似乎造成了不必要的混淆.

首先,它要求程序员在为long超过最大int大小的值(2147483647)分配值时采用特殊语法(将"L"附加到文字).

long x = 2147483647; // Compiles
long y = 2147483648; // Does not compile
long z = 2147483648L; // Compiles
Run Code Online (Sandbox Code Playgroud)

其次,当使用Long包装类时,程序员必须始终使用long文字符号,如本SO问题中所述.

Long x = 250; // Does not compile
Long y = 250L; // Compiles
Run Code Online (Sandbox Code Playgroud)

第三,考虑到从int文字到"较窄"数据类型(shortbyte)的隐式转换在所有情况下(我知道)都可以正常工作,似乎简单地制作所有整数文字类型long将是明显的解决方案...... ?在特殊情况下,这不会完全消除对整数文字附加"L"的奇怪系统的需要吗?

小智 7

此行为是设计1,并在JLS:Java语言规范中编写.

首先,请注意,这是相关的加宽这就是为什么(有效)整数文本提升为长期的价值.相反,这与int literal的规范有关:

如果十六进制,八进制或二进制int文字不适合32位,则为编译时错误.

最小和最大的带符号32位整数值分别为-2147483648和2147483647.


1我不关心为什么它以这种方式工作,而像C#这样的语言有不同的规则.