转换文字数字与在文字数字上使用后缀是否有任何显着差异?
为了显示...
doSomethingWithLong(2L); //vs...
doSomethingWithLong((long) 2);
澄清一下:让我们假设代码仍然使用所使用的文字值进行编译。
转换文字数字与在文字数字上使用后缀是否有任何显着差异?
为了显示...
doSomethingWithLong(2L); //vs...
doSomethingWithLong((long) 2);
澄清一下:让我们假设代码仍然使用所使用的文字值进行编译。
在第一个中,您使用的是long
文字。在第二个中,您将integer
文字转换为long
.
如果值太大而无法存储在int
类型中,它们的行为将不同。例如,第二个代码不会为大于Integer.MAX_VALUE
或小于的值编译Integer.MIN_VALUE
。
在使用整数文字进行算术运算时,您还应该非常小心。当算术运算的结果超出范围时,您可能会得到意想不到的结果。例如:
System.out.println(123456 * 123456); // Will print `-1938485248`
相关帖子:
让我们假设代码仍然使用所使用的文字值进行编译。
假设您有代码编译的文字,字节码没有区别。上述两个调用生成相同的字节码,如下所示。您可以使用javap -c YourClass
命令查看字节码:
0: ldc2_w #2 // long 2l
3: invokestatic #4 // Method doSomethingWithLong:(J)V
6: ldc2_w #2 // long 2l
9: invokestatic #4 // Method doSomethingWithLong:(J)V
你将无法编译
doSomethingWithLong((long) 222222222222222222);
// The literal 222222222222222222 of type int is out of range
因为222222222222222222
不适合int
。
您可以在这个官方 Java 教程中了解原始数据类型。
int 数据类型是一个 32 位有符号二进制补码整数。它的最小值为 -2,147,483,648,最大值为 2,147,483,647(含)。
long 数据类型是一个 64 位有符号二进制补码整数。它的最小值为-9,223,372,036,854,775,808,最大值为9,223,372,036,854,775,807(含)。
让我们假设代码仍然使用所使用的文字值进行编译。
它们是等价的,请参阅 Rohit 的字节码答案。
除了某些不编译的东西,如果你不小心,你可能会得到意想不到的结果 - 5d/2d 返回 2.5 5/2 返回 2