тип данных результатов арифметического вычисления java - PullRequest
7 голосов
/ 02 апреля 2012

В Java я знаю, что тип данных результата арифметического вычисления зависит от типов данных чисел, участвующих в вычислении. Например,

  1. int + int = int

  2. длинный / двойной = двойной

а. Но я не могу найти никаких ссылок, которые могут дать мне все эти правила. Может ли кто-нибудь мне помочь?

б. Как избежать переполнения в арифметическом расчете? Например, результаты 2 long могут больше не вписываться в long ...

Большое спасибо.

Ответы [ 4 ]

3 голосов
/ 02 апреля 2012

а. Эти правила называются числовыми правилами продвижения и указаны в Спецификация языка Java

б. Существует два общепринятых метода борьбы с переполнением.

Первый метод, пост-проверка, где вы выполняете операцию, скажете сложение, а затем проверяете, что результат больше, чем любой из операндов. Например:

int c = a + b;

if( c<a) {  // assuming a>=0 and b>=0
   // overflow happened
}

Второй метод - это предварительная проверка, в которой вы в основном стараетесь не допустить переполнения. Пример:

if( a > Integer.MAX_INTERGER - b ) {
   // overflow happened
}
2 голосов
/ 02 апреля 2012

Специфическим разделом Спецификации языка Java, в котором рассматриваются эти правила, является section 4 .

Если вы вообще не хотите, чтобы значения переполнялись, используйте BigInteger или другой арифметический тип произвольной точности.

Чтобы избежать переполнения в общем случае, Гуава (которому я помогаю) предоставляет такие методы, как IntMath.checkedAdd(int, int) и LongMath.checkedMultiply(long, long), которые генерируют исключения на переполнении. (Некоторые из них нетривиальны для реализации самостоятельно, но все они очень тщательно протестированы.) Вы можете посмотреть на источник, чтобы увидеть, как они работают, но большинство из них полагаются на милые хитрые трюки, чтобы проверить для переполнения эффективно.

1 голос
/ 22 июля 2017

Результатом арифметической операции над любыми двумя примитивными целочисленными операндами будет, по крайней мере, целое число, даже если операнды являются байтами и короткими.

0 голосов
/ 18 ноября 2014

Когда операция включает два типа, меньший тип преобразуется в больший тип.

Подробнее см. Здесь: http://mathbits.com/MathBits/Java/DataBasics/Mathoperators.htm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...