因此,我了解数据类型和文字是什么,但是我对一件事感到困惑。
当数据类型很长时,为什么必须放置L?为什么我不必短而短呢?

// Why does a not work but b does? Both are longs?

long a = 9223372036854775807;
long b = 9223372036854775807L;

最佳答案

Java中仅定义了两种整数文字类型:intlong。后者与前者的区别是后缀Ll。 (字符文字也是整数类型(例如,可以分配给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,则不会发生溢出。


  为什么不必为shortbyte这样做?


首先,请注意,类型为int的文字可以包含您可以分配给shortbyte的任何值,因此不会发生上述问题。而且,不必“不必”使用shortbyte文字,而是因为没有定义此类文字,所以您不必这样做。这一直困扰着我,因为这意味着如果要使用文字参数调用函数,通常必须强制转换为byte

如果您喜欢阅读标准语言,则可以查阅有关Integer Literals (§ 3.10.1) in the JLS的章节。

10-05 22:38
查看更多