2012-04-28 69 views
0

,如果我加上或減去兩個短值,我怎麼能告訴我是否需要標誌進位條件的java總之我怎麼能知道是否需要攜帶

+2

...你在實施DCPU-16嗎? – 2012-04-28 23:30:17

+0

爲什麼你需要這樣做? – 2012-04-28 23:37:04

+0

我正在實現我自己的虛擬cpu(但很好猜猜Matti!) – 2012-04-30 15:50:05

回答

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 2012-04-29 00:08:48

+0

@Voo:你不明白什麼? – blackcompe 2012-04-29 00:40:22

+0

嗯,我要麼省略這個例子,要麼提供一個通用的例子。但是,只有當兩個值都是正值時才起作用。這可能會導致更多的困惑,我想。 – Voo 2012-04-29 09:30:08

3

您可以使用更大的做加法或減法類型如int,將其轉換爲short,然後測試演員是否更改了該值。

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

實際上*任何*小於int值的算術運算無論如何都會擴展爲int,所以我們不需要在那裏進行int轉換。 – Voo 2012-04-29 00:08:11

+0

@Voo:好點,我刪除了不必要的演員。 – 2012-04-29 00:09:54

+1

攜帶和溢出是兩個不同的東西! http://www.piclist.com/techref/method/math/c-vs-o.htm – 2012-04-30 15:51:00

相關問題