当前位置: 首页 > 知识库问答 >
问题:

Java运算符

储毅
2023-03-14

我无法理解加法运算符或short数据类型的概念。

据说;

short a = 1;
short b = 2;
short c = a + b;

这将不会编译,因为加法运算符总是将图表byte数据类型转换为int,我明白这一点。但是这个;

short c = 1 + 2;

完全没问题。所以,如果加法运算符自动将转换为int,然后应用结果(其中结果当然是int),为什么它工作正常?

编辑:这个问题不是原始类型“短”的重复,因为我理解转换过程。此外,这个问题讨论了数据类型的转换,正如我的问题所涉及的int文本。

共有2个答案

白昊乾
2023-03-14

据我所知,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);
罗均
2023-03-14

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指令将3int加载到堆栈上。

    鉴于:

    short a = 1;
    short b = 2;
    short c = a + b;
    

    ab仅在运行时进行评估,因为ab不是常量<他们的价值观随时都可能发生变化
    请注意,编译器并不是试图通过阅读每条语句来猜测ab是否有效地发生了变异来聪明
    它认为它可能只在运行时评估ab

    在这种情况下,为什么ab不产生short,而是产生int
    因为JLS 8规定:

    4.2.2.整数运算

    如果移位运算符以外的整数运算符至少有一个类型为long的运算符,则使用64位精度进行运算,数值运算符的结果为long类型。如果另一个操作数不长,则首先通过数值提升(§5.6)将其扩展(§5.1.5)为long类型。

    否则,使用32位精度进行操作,数值运算符的结果为int类型。如果任一操作数不是int,则首先通过数值提升将其扩展为int类型。

    作为旁注,如果将代码更改为ab常量

    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 语言中的位运算符分为位逻辑运算符和位移运算符两类,下面详细介绍每类包含的运算符。 位逻辑运算符 位逻辑运算