Хорошо. Я думаю, что это невозможно. Если вы считаете то же самое, вам не нужно публиковать ответ. Я прочитал несколько строк из Chapter 5. Conversions and Promotions, и кажется, что в главе 5 нет упоминаний об отключении Conversions and Promotions в Java.Как отключить конверсии и рекламные акции на 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
петли от 0
до 63
.
Тогда первые if
заявление действует как выходная сумму полного сумматора, он использует i
ю цифру a
и что из b
и carry
флага для расчета i + 1
-й разряда (true
или false
). (Обратите внимание, что i = 0
соответствует цифре единиц.) Если true
, он добавляет 1 << i
в c
, где c
изначально 0
.
После этого второй if
заявление действует как выходной флаг переноса полного сумматора, он использует снова i
ю цифру a
и что из b
и carry
флага для расчета carry
флага i + 1
го разряда. Если true
, установите новый флаг carry
на номер true
, если false
, установите новый флаг carry
false
.
Наконец, после выхода из петли for
проверьте, соответствует ли флаг carry
true
. Если true
, бросьте арифметическое исключение.
Однако приведенный выше код не работает. После отладки, оказывается, проблема возникает при
c += (1 << i);
Правильный код должен быть:
c += (1L << i);
потому, что Java будет автоматически продвигать целое 1 << i
к Лонгу и добавить его в c
, не проявляя никакого предупреждения мне ,
У меня есть несколько вопросов относительно этого.
- Можно ли отключить автоматическое продвижение одного типа данных в другой
- Как часто вызывает автоматическое продвижение проблемы для вас?
- Можно ли настроить среду IDE так, чтобы она показывала мне предупреждение при автоматическом продвижении по службе? (Я использую NetBeans IDE 7.3.1 на данный момент.)
Извините за множество вопросов и трудночитаемый код. Я буду изучать CS в сентябре, поэтому я пытаюсь написать код на Java, чтобы ознакомиться с Java.
глава 5 ????/ –
извините, забыть URL –
Возможно, 'FindBugs' будет отмечать этот оператор. –