好的。我认为这是不可能的。如果您有相同的想法,则无需发布答案。我已经阅读了第 5 章的几行。转换和促销,似乎第 5 章没有提到在 Java 中禁用转换和促销。
这是我的动机:
long uADD(long a, long b) {
try {
long c;
c = 0;
boolean carry; //carry flag; true: need to carry; false: no need to carry
carry = false;
for (int i = 0; i < 64; ++i) { //i loops from 0 to 63,
if (((((a >>> i) & 1) ^ ((b >>> i)) & 1) != 0) ^ carry) { //calculate the ith digit of the sum
c += (1 << i);
}
if (((((a >>> i) & 1) & ((b >>> i) & 1)) != 0) || (carry && ((((a >>> i) & 1) ^ ((b >>> i) & 1)) != 0))) {
carry = true; //calculate the carry flag which will be used for calculation of the (i+1)th digit
} else {
carry = false;
}
}
if (carry) { //check if there is a last carry flag
throw new ArithmeticException(); //throw arithmetic exception if true
}
return c;
} catch (ArithmeticException arithmExcep) {
throw new ArithmeticException("Unsigned Long integer Overflow during Addition");
}
}
所以基本上,我正在编写一个对长整数进行无符号加法的方法。如果溢出,它将抛出算术异常。上面的代码可读性不够,所以我应该试着解释一下。
首先,有一个for
循环i
from0
到63
。
然后,第一if
条语句作为全加器的和输出,它使用 的i
第 位a
和的第 位b
和carry
标志来计算i + 1
第 位(true
或false
)。(请注意,i = 0
对应于个位。)如果true
,它添加1 << i
到c
,其中c
最初是0
。
之后,第二if
条语句作为全加器的进位标志输出,它再次使用 的i
第 位a
和b
and carry
flag 的第 1 位来计算第 1 位的carry
标志i + 1
位。如果true
,设置新carry
标志true
,如果false
,设置新carry
标志false
。
最后,退出for
循环后,检查carry
标志是否为true
. 如果true
,则抛出算术异常。
但是,上面的代码不起作用。调试后发现问题出现在
c += (1 << i);
正确的代码应该是:
c += (1L << i);
因为Java会自动将整数提升1 << i
为 Long 并将其添加到c
,对我没有任何警告。
我对此有几个问题。
- 是否可以禁用将一种数据类型自动提升为另一种数据类型
- 自动促销多久给您带来问题?
- 是否可以调整 IDE,以便在发生自动升级时向我显示警告?(我目前使用的是 NetBeans IDE 7.3.1。)
很抱歉有很多问题和难以阅读的代码。我将在 9 月份学习 CS,所以我尝试用 Java 编写一些代码来熟悉 Java。