2013-09-05 20 views
3

铸造文字数字与使用文字数字后缀是否有任何显着差异?Java数字“铸造”中的任何显着差异

为了说明...

​​

澄清:让我们假设中的代码仍然与所使用的文字值编译。

+3

有时你需要发布提问之前做一些测试。 –

+2

关于您的说明:生成的字节码没有区别。 – jlordo

回答

8

在第一个中,您使用的是文字long。在第二个中,您将integer文字转换为long

如果值太大而无法存储在int类型中,它们将不会表现相同。例如,对于大于Integer.MAX_VALUE或小于Integer.MIN_VALUE的值,代码将不编译。

在使用整数文字进行运算时,您应该非常小心。当算术运算的结果超出范围时,您可能会得到意想不到的结果。对于e.g:

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 
8

你不会是能够编译

doSomethingWithLong((long) 222222222222222222); 
// The literal 222222222222222222 of type int is out of range 

因为222222222222222222不适合在int

您可以阅读关于this official Java tutorial中的原始数据类型。

int数据类型是一个32位有符号二进制补码整数。它有 最小值-2,147,483,648和最大值2,147,483,647 (含)。

长数据类型是一个64位有符号二进制补码整数。它有 最小值-9,223,372,036,854,775,808和最大值 9,223,372,036,854,775,807(含)。

我们假设代码仍然使用所使用的文字值进行编译。

它们是等价的,请参阅Rohit的字节码答案。

0
从某些事情

除了不能编译,你可以得到意想不到的结果,如果你不小心 - 5D/2D返回2.5 5/2回报2