【问题标题】:is it possible to upcast an increment operator from int to long in java?是否可以在java中将增量运算符从int转换为long?
【发布时间】:2021-02-13 16:31:27
【问题描述】:

假设我为一个 int 变量分配了最大值。

int a = 2147483647;

如果我增加,它会导致溢出。

System.out.println(++(long)a);

这甚至允许吗?上面的行给出了错误 java:意外的类型 必需:变量 找到:值

【问题讨论】:

  • 事后不能更改变量的类型。即使语法被接受,您也不能将变量a 的类型从int 动态修改为long

标签: java casting


【解决方案1】:

这是不允许的。强制转换改变了表达式的类型,因此产生了一个表达式++ 运算符递增变量,而不是表达式,因此它不能对表达式(long)a 进行操作。

为了使++(long)a 有意义,a 在运行后将具有 long 类型,但 Java 是静态类型的。变量的类型一旦被声明就不能改变!您可以创建另一个类型为long 的变量,并将a 分配给它。然后你可以增加新变量而不会导致溢出。

long longA = a;
System.out.println(++longA);

另一种方法是让int溢出,把溢出的int当作long处理:

System.out.println(Integer.toUnsignedLong(++a));

这会让人产生ints 突然可以存储更大范围的数字的错觉,但实际上您只是在以另一种方式解释否定的ints。

【讨论】:

    【解决方案2】:

    ++ 不仅增加值,它还将结果值存储回来 - 它需要一个变量,一个可以在赋值左侧使用的表达式 - 同样((long) a = ... 无效。

    只需使用(long)a + 1


    ++JLS 15.15.1. Prefix Increment Operator ++的文档

    ... 一元表达式的结果必须是变量...否则会发生编译时错误。 ...

    强制转换 ((long)a) 不会产生变量,不能使用。

    【讨论】:

      【解决方案3】:

      让我们这样理解。 (long)++a(long)a++ 将起作用,但在 (long)++a 的情况下,类型转换将在增量后发生,其中位已经为 int 泛滥。所以,你不会得到你想要达到的。在您的情况下++(long)a,这是您的代码无法编译的无效参数问题。但你可以这样做:

      int a = 2147483647;
      long b=(long)a;
      System.out.println(++b);
      

      【讨论】:

        猜你喜欢
        • 2015-04-27
        • 2020-11-21
        • 1970-01-01
        • 1970-01-01
        • 2010-10-25
        • 2017-09-12
        • 1970-01-01
        • 2010-11-21
        • 1970-01-01
        相关资源
        最近更新 更多