我的任务是编写一个程序,将一个数字从十进制数字系统转换为另一个数字系统。有两个输入值:十进制数和新系统的基数。我写了一些东西,但它给了我一个"浮点异常./a.out"错误。尽管我知道浮点异常意味着除以零,但我无法在我的代码中找到它。你可以指导我导致这个错误的原因吗?
int main() {
int input, base, newBase, convertion;
scanf("%d %d", &input, &base);
newBase = base;
for ( ; input / base != 0; ) {
base *= newBase;
}
for ( int reminder = input % base; base > 1; reminder %= base ) {
base = base / newBase;
convertion = reminder / base;
printf("%d", convertion);
}
printf("\n");
return 0;
}
答案 0 :(得分:0)
当您将base输入为0时会出现该错误,因此input / base
因0
除法而无效。
您应该实现代码以避免这种情况,例如使用循环请求输入,直到它是正确的:
do{
scanf("%d", &base);
newBase = base;
}while( base <= 0);
答案 1 :(得分:0)
SIGFPE
信号是由致命的算术错误引起的;包括整数和浮点算术错误;并包括除零和溢出。
在80x86 CPU上,如果(整数)除法溢出,则会导致相同的&#34;除错误&#34;除数除外;因此,内核可以将两个原因(以及各种浮点异常)映射到SIGFPE
信号。另外,除法和模数是相同的指令(div
和idiv
都返回商和余数),因此你也可以从整数模数结束SIGFPE。
如果用户输入&#34; base = 0&#34;你在input / base
中得到零除。如果用户输入&#34; base = 1&#34;你最终会得到一个无限循环。如果用户输入负数,那么我甚至不想考虑会发生什么。
如果用户为input
输入较大的值(例如相当于INT_MAX
),则很可能会获得无限循环;因为base *= newBase
溢出,因此input / base != 0
永远不会停止循环。
对于最后一个问题;如果base
是2的幂(例如2,4,8,......),则base *= newBase
可以/将溢出,使得基数变为零;之后导致除数为零。