因此,我了解数据类型和文字是什么,但是我对一件事感到困惑。
当数据类型很长时,为什么必须放置L?为什么我不必短而短呢?
// Why does a not work but b does? Both are longs?
long a = 9223372036854775807;
long b = 9223372036854775807L;
最佳答案
Java中仅定义了两种整数文字类型:int
和long
。后者与前者的区别是后缀L
或l
。 (字符文字也是整数类型(例如,可以分配给int
,但是Java语言规范(JLS)将其与整数文字分开对待。)
请记住,除了推断通用类型参数外,赋值左手侧的类型对右手侧的求值没有影响。因此,如果为long
类型的变量赋值,则将首先对表达式求值,然后才将结果转换为long
(如果可能和必要)。
该声明
long a = 10;
是完全有效的。仅由整数文字
10
组成的右侧表达式将被求值,然后提升为long
,然后将其分配给变量a
。除非您要分配的值太大而不能在int
中表示,否则这将很好地工作,在这种情况下,您还必须使类型为long
的文字。这个“问题”不限于文字。考虑以下经常咬新用户的语句:
long a = Integer.MAX_VALUE + 1;
右侧的表达式使用
int
算术求值,因此会溢出。只有这样,结果(−2147483648)才会提升为long
并分配给a
,但现在为时已晚。如果1
被写为1L
,则不会发生溢出。为什么不必为
short
或byte
这样做?首先,请注意,类型为
int
的文字可以包含您可以分配给short
或byte
的任何值,因此不会发生上述问题。而且,不必“不必”使用short
或byte
文字,而是因为没有定义此类文字,所以您不必这样做。这一直困扰着我,因为这意味着如果要使用文字参数调用函数,通常必须强制转换为byte
。如果您喜欢阅读标准语言,则可以查阅有关Integer Literals (§ 3.10.1) in the JLS的章节。