-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

2 的补码平台的一些现代实现会生成“浮点异常”以响应以下代码中发生的整数除法溢出

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

甚至认为那里没有任何“漂浮”的东西。GCC 就是这种平台的一个例子。

显然,您的表达式遇到了与“过度移位”整数触发的未定义行为的实际平台特定表现相同的问题。

PS 正如@Jonathan Leffler 所指出的,整数除以零也会在 GCC 中生成“浮点异常”,这在您的情况下可能更可能发生。

于 2016-10-08T00:33:20.450 回答
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 回答