-4
#include <stdio.h>
int test1(int x, int n){
    int times=31/n;
    return ((1-(1<<(n*times)))/(1-(1<<n)));
}

1<=n<=32 の計算をしています

1<=n<=31 の場合にのみ機能します。n=32 に変更するにはどうすればよいですか? xcode で n=32 ケースをテストすると、デバッガーがトリガーされ、スレッド 1 exc_arithmetic(code=exc_i386_div....が表示
されます。よろしくお願いします。

4

3 に答える 3

1

あなたがそうするとき1 << 32、それが として扱われるかなりの可能性があります1 << 0(そして、未定義の動作を呼び出しているので、それは問題ありません)、整数の「ゼロ除算」を行っているため、「浮動小数点例外」が発生します. 最近では、これが例外の最も一般的な原因です。浮動小数点演算を行っている場合は、ゼロ除算に対して (暗黙のうちに) 無限大が返されます。

于 2016-10-07T21:34:56.987 に答える
0

これを修正する方法を知りました。問題は1<<32ケースです(私はこれを避けようとします)。

数学を適用する別の方法に変更1 << nしました。(1 << (n-1) )*2

return ((1-(1<<(n*times)))/(1- (1<<(n-1))*2  ));
于 2016-10-07T23:05:22.010 に答える
0

2 の補数プラットフォームの一部の最新の実装では、次のコードで発生する整数除算のオーバーフローに応答して「浮動小数点例外」が生成されます。

int a = INT_MIN;
int b = -1;
int c = a / b;

そこに「浮かんでいる」ものは何もないとさえ思っていました。GCC はそのようなプラットフォームの一例です。

どうやら、あなたの式は、整数の「オーバーシフト」によって引き起こされる未定義の動作の実際のプラットフォーム固有の症状と同じ種類の問題に遭遇します。

PS @Jonathan Leffler が指摘したように、ゼロによる整数除算も GCC で「浮動小数点例外」を生成します。これは、おそらくあなたのケースで発生する可能性がさらに高くなります。

于 2016-10-08T00:33:20.450 に答える