2013-05-31 65 views
-2

我有一個小程序,一底座10號轉換成一種鹼36數目。這裏是Python代碼,它按預期工作。的Python對C:不同的輸出

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代碼給出正確的輸出。我有一種感覺,它與模量有關,但我無法弄清楚。請幫忙!謝謝!

+2

以何種方式做「4 45 46」代表0和「4 9 24」代表200?你到目前爲止做了哪些調試? –

+0

editingeditingediting – Exastify

+0

0在我的基地36將只是全部爲零,而我的基地36個數字是從1開始0x04訪問十六進制代碼。所以零是0×04,一個爲0x05,等等。直到35.因此,一個十進制0轉換爲我的系統將是0×04 0×04 0×04,但是我不允許重複,所以0x2D(或十進制45)第一表示重複,並且0x2E(或十進制46)表示重複第二次。這就是0如何正確轉換爲0x04 0x2D 0x2E(或如何打印它,4,45 46)。同樣,200應該是0x04 0x09 0x24(4 9 24) – Exastify

回答

2

問題是你在void largeNumToKeyboard(int num)功能使用char類型,以及正在測試的值有可能溢出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 
3

在C代碼,你應該INT類型使用。字符類型只能有一個範圍從0到255

char a = num/1296; 
char ar = num % 1296; 
char b = ar/36; 
char c = ar % 36; the C code