【发布时间】:2021-02-13 16:31:27
【问题描述】:
假设我为一个 int 变量分配了最大值。
int a = 2147483647;
如果我增加,它会导致溢出。
System.out.println(++(long)a);
这甚至允许吗?上面的行给出了错误 java:意外的类型 必需:变量 找到:值
【问题讨论】:
-
事后不能更改变量的类型。即使语法被接受,您也不能将变量
a的类型从int动态修改为long。
假设我为一个 int 变量分配了最大值。
int a = 2147483647;
如果我增加,它会导致溢出。
System.out.println(++(long)a);
这甚至允许吗?上面的行给出了错误 java:意外的类型 必需:变量 找到:值
【问题讨论】:
a 的类型从int 动态修改为long。
这是不允许的。强制转换改变了表达式的类型,因此产生了一个表达式。 ++ 运算符递增变量,而不是表达式,因此它不能对表达式(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。
【讨论】:
++ 不仅增加值,它还将结果值存储回来 - 它需要一个变量,一个可以在赋值左侧使用的表达式 - 同样((long) a = ... 无效。
只需使用(long)a + 1
++JLS 15.15.1. Prefix Increment Operator ++的文档
... 一元表达式的结果必须是变量...否则会发生编译时错误。 ...
强制转换 ((long)a) 不会产生变量,不能使用。
【讨论】:
让我们这样理解。
(long)++a 和 (long)a++ 将起作用,但在 (long)++a 的情况下,类型转换将在增量后发生,其中位已经为 int 泛滥。所以,你不会得到你想要达到的。在您的情况下++(long)a,这是您的代码无法编译的无效参数问题。但你可以这样做:
int a = 2147483647;
long b=(long)a;
System.out.println(++b);
【讨论】: