操作数无效到二进制%?

时间:2015-02-18 01:01:52

标签: c

我不知道出了什么问题,为什么我会收到这个错误。我四处搜寻,我无法理解我的生活。

void print_arb_base(unsigned int n, unsigned int b) {

    char output[36] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z'};

    int t = n; //Keep track of the number

    int s = 0; //The space we are currently on
    while(pow(b, s) < t) {

        s++;

    }

    s--;

    for(int i = s; i >= 0; i--) {

        int r = t % pow(b, i); //Gets number that goes into this part of base number
        t = t - r * pow(b, i);

        printf("%c", output[r]);

    }

}

2 个答案:

答案 0 :(得分:2)

模数运算符(%)仅适用于整数操作数,而pow()返回double。您需要将其结果转换为整数类型,或者更安全地使用类似lrint()的调用,该调用将舍入到最接近的整数结果。也许你的意思是:

int r = t % lrint(pow(b, i));

如果您尝试在任意基础上打印数字,那么您可能意味着:

unsigned long div = b;

while (div <= t)
    div *= b;

div /= b;

for(; 0 != div; div /= b) {
    unsigned long d = t / div;

    t -= d * div;

    printf("%c", output[d]);
}

答案 1 :(得分:0)

函数pow返回一个double值。

你不能用int值修改它。

你可以做到

int r = t % (int)pow(b, i);

要摆脱错误,但它可能会或可能不会做你想要的。