4

cのオーバーフローをチェック/防止する2つの関数を作成しようとしています(!〜|&^ +のみを使用)が、取得できません。1つ目は、特定の2つのcompliment / signed intが証明書のビット数に収まるかどうかです。fitsB(int x、int n)ここで、はintで、nは使用するビットのサイズです。また、2つのintを足し合わせたときにオーバーフローしないかどうかを確認する関数overflowInt(int x、int y)。それらが署名されていないintである場合、私はそれを得ることができますが、ネガティブは私にとって物事を難しくします。誰もが方法を知っていますか?

また、キャストはなく、intは常に32ビットです

4

3 に答える 3

6
/* 
 * 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));
}
于 2014-02-08T18:49:57.727 に答える
0

x <2 ^(n-1)の場合、xはnビットに収まります。

オーバーフローの質問には、より多くの情報が必要です。2つのintをlong(またはdouble)に割り当てても、オーバーフローしません。

于 2012-04-09T19:45:23.253 に答える
0

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

これは、初期入力が32ビット量をオーバーフローせず(この状態でエラーが発生することを願っています)、使用しているビット数が32未満であることを前提としています(負の範囲に1を加算し、32ビットがある場合はオーバーフローします。説明については、以下を参照してください)。

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

于 2012-04-10T00:41:02.513 に答える