#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&lt; = n&lt; = 31时才有效,如何在n = 32时更改?当我在xcode中测试其n = 32的情况时,它会触发调试器并显示线程1 exc_arithmetic(code = exc_i386_div ....
提前谢谢。
答案 0 :(得分:1)
有一个很好的机会,当你1 << 32
时,它被视为1 << 0
(并且,因为你正在调用未定义的行为,那没关系),然后你得到'浮动点'异常'因为你正在做一个整数'除以零'。这些天,这是例外的最常见原因。如果你正在进行浮点运算,你会得到一个无穷大(无声)返回除以零。
答案 1 :(得分:0)
我刚刚发现了如何解决这个问题。问题是1<<32
案例(我会尽量避免)。
我将1 << n
更改为(1 << (n-1) )*2
,这是另一种应用数学的方法。
return ((1-(1<<(n*times)))/(1- (1<<(n-1))*2 ));
答案 2 :(得分:0)
2-s补码平台的一些现代实现产生了一个&#34;浮点异常&#34;响应于以下代码中出现的整数除法溢出
int a = INT_MIN;
int b = -1;
int c = a / b;
甚至认为没有什么&#34;漂浮&#34;那里。海湾合作委员会就是这种平台的一个例子。
显然,你的表达遇到的问题与过度移动&#34;触发的未定义行为的实际平台特定表现相同。一个整数。
P.S。正如@Jonathan Leffler所指出的,整数除以零也会产生一个&#34;浮点异常&#34;在GCC中,你的情况可能更有可能发生。