, если добавить или вычесть два коротких значения, как я могу сказать, если я должен был бы флаг условие переносаява Короче, как я могу сказать, если перенос необходим
ответ
В случае сложения и вычитания только, арифметическое переполнение произошло, когда оба операнда являются положительными, и результат отрицательный, и наоборот.
class OverflowTest
{
public static void main (String[] args)
{
System.out.println(isOverflow((short)32767, (short)32767, '+'));
System.out.println(isOverflow((short)-32767, (short)-32767, '+'));
System.out.println(isOverflow((short)32767, (short)-32767, '+'));
}
private static boolean isOverflow(short a, short b, char op) {
short c = (op == '+') ? (short)(a+b) : (short)(a-b);
if((a > 0 && b > 0 && c < 0) || (a < 0 && b < 0 && c > 0))
return true;
return false;
}
}
Текстовое объяснение в порядке, но я действительно не могу следовать примеру вашего кода. – Voo
@ Voo: Что вы не понимаете? – blackcompe
Хорошо, я бы либо опустил пример, либо предоставил общий. Но что-то, что работает только тогда, когда оба значения положительны? Вероятно, это вызывает больше путаницы. – Voo
Вы можете сделать сложение или вычитание с использованием большего типа int
, отбросите его до short
и проверьте, изменяет ли значение значение.
int i = s1 + s2;
short s = (short)i;
if (i != s) { /* overflow */ }
На самом деле * любая * арифметическая операция с меньшими, чем значениями int, во всяком случае расширяется до int, поэтому нам не нужны функции int cast. – Voo
@ Voo: Хорошо, я удалил ненужные броски. –
перенос и переполнение - две разные вещи !!! http://www.piclist.com/techref/method/math/c-vs-o.htm –
... Вы внедряете DCPU-16? –
Зачем вам это нужно? –
Я реализую свой собственный виртуальный процессор (но очень хорошо догадываюсь Матти!) –