我无法理解加法运算符或short
数据类型的概念。
据说;
short a = 1;
short b = 2;
short c = a + b;
这将不会编译,因为加法运算符总是将短
,图表
,byte
数据类型转换为int
,我明白这一点。但是这个;
short c = 1 + 2;
完全没问题。所以,如果加法运算符自动将短
转换为int
,然后应用结果(其中结果当然是int
),为什么它工作正常?
编辑:这个问题不是原始类型“短”的重复,因为我理解转换过程。此外,这个问题讨论了数据类型的转换,正如我的问题所涉及的int
文本。
据我所知,Java支持int和long,但正如所指定的,不支持short。没有自动类型转换,因为该操作被指定在int或long数据类型上执行。
看见https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.6.2
如果希望获得有效结果,并且知道结果不会导致溢出,可以强制转换结果:
short a = 1;
short b = 2;
short c = (short)(a + b);
12
是一个常量表达式,而ab
不是<这取决于对它们的评估
第一个将在编译时完成,第二个将在运行时完成
JLS 8指出:
15.28.常量表达式
常量表达式是表示基元类型的值或String的表达式,该值不会突然完成,并且仅使用以下内容组成:
>
基本类型的文字和字符串类型的文字(§3.10.1,§3.10.2,§3.10.3,§3.10.4,§3.10.5)
转换为基本类型和转换为类型字符串(§15.16)
一元运算符、~、和!(但不是或——)(§15.15.3、§15.15.4、§15.15.5、§15.15.6)
乘法运算符*、/、和%(§15.17)
加法运算符和-(§15.18)
...........................
在这里:
short c = 1 + 2;
1 2
由两个int
文字和一个加法运算符组成。
因此它被认为是一个常量表达式。
常量表达式在编译时计算。
因此短c
被计算为3
下面是一个示例类:
package stackoverflow;
public class EvaluationClass {
public void foo(){
short c = 1 + 2;
}
}
以下是反汇编代码:
Compiled from "EvaluationClass.java"
public class stackoverflow.EvaluationClass {
public stackoverflow.EvaluationClass();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."<init>":()
4: return
public void foo();
Code:
0: iconst_3
1: istore_1
2: return
}
我们可以看到0:iconst_3
指令将3
int
加载到堆栈上。
鉴于:
short a = 1;
short b = 2;
short c = a + b;
ab
仅在运行时进行评估,因为a
和b
不是常量<他们的价值观随时都可能发生变化
请注意,编译器并不是试图通过阅读每条语句来猜测a
和b
是否有效地发生了变异来聪明
它认为它可能只在运行时评估ab
在这种情况下,为什么ab
不产生short
,而是产生int
因为JLS 8规定:
4.2.2.整数运算
如果移位运算符以外的整数运算符至少有一个类型为long的运算符,则使用64位精度进行运算,数值运算符的结果为long类型。如果另一个操作数不长,则首先通过数值提升(§5.6)将其扩展(§5.1.5)为long类型。
否则,使用32位精度进行操作,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其扩展为int类型。
作为旁注,如果将代码更改为a
和b
常量
:
final short a = 1;
final short b = 2;
short c = a + b;
这将很好地编译,因为a b
将被计算为常量表达式(3
)。
主要内容:一元运算符,二元运算符,算术赋值运算符运算符丰富是 Java 语言的主要特点之一,它提供的运算符数量之多,在高级语言中是少见的。 Java 语言中的运算符除了具有优先级之外,还有一个结合性的特点。当一个表达式中出现多种运算符时,执行的先后顺序不仅要遵守运算符优先级别的规定,还要受运算符结合性的约束,以便确定是自左向右进行运算还是自右向左进行运算。这些 运算符按照操作数的数量可以分为单目运算符、双目运算符和三目运算符。 最基本的运算符包
问题内容: 有人可以解释运算符在Java中的作用。我在HashMap中的Hash方法这个问题中遇到了它。从其在问题中的用法来看,它似乎是移位运算符- 和之间有什么区别? 问题答案: 从Java教程: 无符号右移运算符“ >>>”将零移位到最左位置,而“ >>”之后的最左位置取决于符号扩展名。
问题内容: 嗨,我可以知道Java?:运算符是什么,我正试图查找有关其工作方式的信息,但我不知道它叫什么,在Google中键入?:不能给出正确的结果。 问题答案: 它是 条件 运算符。 有人称它为 三元 运算符,但这实际上只是在说它有多少个操作数。特别是,Java的未来版本可以(完全合理地)引入 另一个 三元运算符-而运算符的_名称_ 是条件运算符。 参见语言规范的15.25节: 条件运算符?:使
我们已经学会了如何声明变量和赋值变量。那么你可能想知道如何对它们进行操作。本小节我们学习的运算符就可以对它们进行运算。 运算符是一些特殊的符号,它们对一个,两个或多个操作数执行特定的运算,然后返回一个结果。这里的操作数指的就是运算符操作的实体。 Java 提供了一组丰富的运算符来操作变量。 我们可以将所有 Java 运算符分为以下几类: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 其
问题内容: 是否有可以与运算符一起使用的有效的类Type变量?例如: 作为替代方案: 会有性能上的好处吗? 问题答案: 你在做什么实际上是不一样的。考虑一下子类会发生什么(我知道您不能子类,所以在这种情况下不要紧)。 如果您有一个对象,并且想知道它是否是某种类型的实例,并且您有该对象,则可以使用该方法。 无论哪种情况,我都希望性能差异不大。
主要内容:位逻辑运算符,位移运算符,复合位赋值运算符Java 定义的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括 long,int,short,char 和 byte。 位运算符主要用来对操作数二进制的位进行运算。按位运算表示按每个二进制位(bit)进行计算,其操作数和运算结果都是整型值。 Java 语言中的位运算符分为位逻辑运算符和位移运算符两类,下面详细介绍每类包含的运算符。 位逻辑运算符 位逻辑运算