2012-04-28 4 views
0

, если добавить или вычесть два коротких значения, как я могу сказать, если я должен был бы флаг условие переносаява Короче, как я могу сказать, если перенос необходим

+2

... Вы внедряете DCPU-16? –

+0

Зачем вам это нужно? –

+0

Я реализую свой собственный виртуальный процессор (но очень хорошо догадываюсь Матти!) –

ответ

0

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

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; 
     } 
} 
+0

Текстовое объяснение в порядке, но я действительно не могу следовать примеру вашего кода. – Voo

+0

@ Voo: Что вы не понимаете? – blackcompe

+0

Хорошо, я бы либо опустил пример, либо предоставил общий. Но что-то, что работает только тогда, когда оба значения положительны? Вероятно, это вызывает больше путаницы. – Voo

3

Вы можете сделать сложение или вычитание с использованием большего типа int, отбросите его до short и проверьте, изменяет ли значение значение.

int i = s1 + s2; 
short s = (short)i; 
if (i != s) { /* overflow */ } 
+0

На самом деле * любая * арифметическая операция с меньшими, чем значениями int, во всяком случае расширяется до int, поэтому нам не нужны функции int cast. – Voo

+0

@ Voo: Хорошо, я удалил ненужные броски. –

+1

перенос и переполнение - две разные вещи !!! http://www.piclist.com/techref/method/math/c-vs-o.htm –