【问题标题】:Why plus operator in Java always produces Integer? [duplicate]为什么Java中的加号运算符总是产生整数? [复制]
【发布时间】:2014-01-17 12:37:59
【问题描述】:

我有这样的代码

short a = 1;
short b = 2 ;
short c = a + b; // dosen't compile

编译失败的原因是什么? x + x 总是产生Integer更大 Number,但为什么呢?

【问题讨论】:

标签: java compiler-errors jvm language-specifications


【解决方案1】:

二元运算符都不会产生Integer。但是,它将使用 int 而不是较短的类型,byteshortchar 如果编译器可以内联该值,它可以为您转换该值。例如

final short a = 1;
final short b = 2;
short c = a + b; // does compile, because of constant inlining.

产生Integer 的唯一运算符是强制转换。

Integer i = (Integer) 1;

顺便说一句:奇怪的是,Java 将 32 位 float 定义为比 64 位 long 值“更宽”。这样做的缺点是浮点数的精度要低得多。考虑一下。

long l = 7777777777777777777L;
l += 0.0f;
System.out.println(l);

打印

7777777579364188160

即使将 0.0F 添加到 l,它也会隐式转换为 float(因为 float 更宽),然后再转换回(因为使用了运算符赋值),导致大约 200 亿个错误。

【讨论】:

  • +1:今天学到了一些东西:)
  • +1。我也是。谢谢:)
  • @kocko ab编译时常量,无论它们在代码中的何处使用,它们的都会编译到. 字节码不包含源代码实际上有变量保存值的事实。
  • @kocko 这意味着编译器将值放入代码中,就好像您在那里键入它一样,即字节码将读取 short c = 3; 这通常无关紧要,但如果您使用更改常量反思它可能意味着它不会改变任何东西。
  • 感谢你们简单明了的澄清:)
猜你喜欢
  • 1970-01-01
  • 2011-04-02
  • 2012-06-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 2023-03-11
  • 2013-04-27
相关资源
最近更新 更多