在C中从十进制转换为另一个数字系统

时间:2014-09-14 13:55:42

标签: c

我的任务是编写一个程序,将一个数字从十进制数字系统转换为另一个数字系统。有两个输入值:十进制数和新系统的基数。我写了一些东西,但它给了我一个"浮点异常./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;
}

2 个答案:

答案 0 :(得分:0)

当您将base输入为0时会出现该错误,因此input / base0除法而无效。

您应该实现代码以避免这种情况,例如使用循环请求输入,直到它是正确的:

do{
        scanf("%d", &base);
        newBase = base;
  }while( base <= 0);

答案 1 :(得分:0)

SIGFPE信号是由致命的算术错误引起的;包括整数和浮点算术错误;并包括除零和溢出。

在80x86 CPU上,如果(整数)除法溢出,则会导致相同的&#34;除错误&#34;除数除外;因此,内核可以将两个原因(以及各种浮点异常)映射到SIGFPE信号。另外,除法和模数是相同的指令(dividiv都返回商和余数),因此你也可以从整数模数结束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可以/将溢出,使得基数变为零;之后导致除数为零。