-2

我有一个小程序,可以将基数为 10 的数字转换为一种基数为 36 的数字。这是 Python 代码,它按预期工作。

def numToKey(num):
    start = 0x04;
    i = 0;
    for i in range(0,num):
        start+=1
    return start;


def largeNumToKeyboard(num):
    a = num / 1296;
    ar = num % 1296;
    b = ar / 36;
    c = ar % 36;

    a = numToKey(a);
    b = numToKey(b);
    c = numToKey(c);

    newb = b;
    if(a == b):
        newb = 0x2D;

    if(c == b):
        c = 0x2E;


    print a,newb,c
    print

largeNumToKeyboard(0)
largeNumToKeyboard(200)

输出是

4 45 46
4 9 24

“4 45 46”正确表示 0,“4 9 24”正确表示 200。

但问题是,在我将其转换为 C 代码后它停止工作。

#include <stdio.h>

int main(int argc, char **argv)
{
    printf("hello world\n");
    largeNumToKeyboard(0);
    largeNumToKeyboard(200);
    return 0;
}

char numToKey(char num) {
    char start = 0x04;
    char i = 0;
    for (i = 0; i < num; i++) {
        start++;
    }
    return start;
}

void largeNumToKeyboard(int num) {
    char a = num / 1296;
    char ar = num % 1296;
    char b = ar / 36;
    char c = ar % 36;

    a = numToKey(a);
    b = numToKey(b);
    c = numToKey(c);
    char newb = b;
    if(a == b){
        newb = 0x2D;
    }
    if(c == b){
        c = 0x2E;
    }
    printf("%d ",a);
    printf("%d ",newb);
    printf("%d\r\n",c);

}

现在输出是

4 45 46
4 45 46

我不明白为什么对于 200 的输入,C 代码给出了错误的输出,但 python 代码给出了正确的输出。我觉得它与模数有关,但我无法弄清楚。请帮忙!谢谢!

4

2 回答 2

3

在 C 代码中,您应该使用 int 类型。char 类型的范围只有 0 到 255。

char a = num / 1296;
char ar = num % 1296;
char b = ar / 36;
char c = ar % 36; the C code 
于 2013-05-31T17:15:32.167 回答
3

问题是您char在函数中使用类型void largeNumToKeyboard(int num),并且您正在测试的值可能会溢出char. 您至少需要将前三个更改为int...

void largeNumToKeyboard(int num) {
    int a = num / 1296;
    int ar = num % 1296;
    int b = ar / 36;
    char c = ar % 36;

    a = numToKey(a);
    b = numToKey(b);
    c = numToKey(c);
    char newb = b;
    if(a == b){
        newb = 0x2D;
    }
    if(c == b){
        c = 0x2E;
    }
    printf("%d ",a);
    printf("%d ",newb);
    printf("%d\r\n",c);

}

...然后它打印输出...

4 45 46
4 9 24
于 2013-05-31T17:15:50.773 回答