2012-04-09 15 views
0

私はオーバーフローをチェック/防止する(〜〜&^+のみを使用しますが、それを得ることはできません)という2つの関数を記述しようとしています。最初は、特定の2つの補数/符号付きintが、証明書のビット量に収まるでしょう:fitsB(int x、int n)ここで、intは、使用するビットのサイズです。一緒に追加されたときに2つのintがオーバーフローしないかどうかをチェックする関数:overflowInt(int x、int y)。彼らが無署名のintであれば私はそれを得ることができますが、ネガは私のために物事を難しくします。誰でも知っている方法?ビット単位のオーバーフローチェックin c

も全く鋳造がないとint値は、x < 2 ^(N-1)であれば、nビットに収まる

+5

質問をするのを忘れました。 –

答えて

2
/* 
* addOK - Determine if can compute x+y without overflow 
* Example: addOK(0x80000000,0x80000000) = 0, 
*   addOK(0x80000000,0x70000000) = 1, 
* Legal ops: ! ~ &^| + << >> 
* Max ops: 20 
* Rating: 3 
*/ 
int addOK(int x, int y) { 
    // Find the sign bit in each word 
    //if a and b have different signs, you cannot get overflow. 
    //if they are the same, check that a is different from c and b is different from c, 
    // if they are the same, then there was no overflow. 
    int z=x+y; 
    int a=x>>31; 
    int b=y>>31; 
    int c=z>>31; 
    return !!(a^b)|(!(a^c)&!(b^c)); 
} 
+0

これはあなたのために機能しますか? – Eric

+0

'sizeof(int)* 8-1'は' 31'より私のためにきれいに見えます。 –

+0

私は常に32ビットとしてintを定義していたので、私は31を使用しました。私が取っていたコースでこの関数を作成したときに定義された "legal ops"の外にあるすべての関数とメソッドは避けました。 – Eric

0

xは常に32ビットです。

オーバーフローに関する質問にはさらに詳しい情報が必要です。 2つのintは、long(またはdouble)に割り当てるとオーバーフローしません。

+0

キャスティングなし、32bit int – Gekctek

0

上記の例(Adam Shiemke)を使用すると、n個のビットの範囲を取得するために最大(正の)値と最小値(負の値)を見つけることができます。 2 ^(n-1)(アダムの例から)であり、nビットで表すことができる最大/正数についてはマイナス1である。最小値については、最小値x => - (2 ^(n-1))を得るために2 ^(n-1)を打ち消す。 (最小範囲の> = not>に注意してください)。例えば、n = 4ビットの場合、2 ^(4-1)-1 = 2^3 -1 = 7 so x < = 7およびx> = -8 =( - (2 ^(4-1))。

これは、最初の入力が32ビットの量子化をオーバーフローさせないことを前提としています(その状態でエラーが発生することを願っています)、使用しているビット数が32未満です

最大値を持つ場合、加算がオーバーフローするかどうかを判断するには、x + y < =最大値です。代数を使用すると、yを得ることができます< =最大値 - x次に、渡されたyの値を比較して、条件を満たす場合、加算がオーバーフローします。たとえば、xが最大値である場合、t 0,= 0なので、yは0以下でなければならないか、加算がオーバーフローします。