2014-01-07 77 views
-3

寫下面的代碼給我奇怪的答案奇怪的結果在C

#include <stdio.h> 

int main (void) 
{ 
    char a=0x03 ,b=0x01 ,x; 

    printf("Enter two numbers : \n"); 
    scanf("%c %c",&a,&b); 
    printf("0x%x 0x%x\n",a,b); 
    printf("0x%x || 0x%x = 0x%x \n0x%x^0x%x = 0x%x\n0x%x << 0x%x = 0x%x\n0x%x >> 0x%x = 0x%x\n",a,b,a||b,a,b,a^b,a,b,a<<b,a,b,a>>b); 
    scanf("%i",x); 

    return 0; 
} 

這給了我下面的結果

Enter two numbers : 
2 3 
32 33 
0x32 || 0x33 = 0x1 
0x32^0x33 = 0x1 
0x32 << 0x33 = 0x1900000 
0x32 >> 0x33 = 0x0 

我不知道爲什麼它採取錯誤的值成a和b 雖然我已經嘗試過使用int並且它運行良好?!

+3

'scanf(「%i」,x);'???加工???? –

+0

是的,如果類型是int – Salahuddin

+1

'scanf(「%i」,地址)',所以它不能工作......它會導致一個「訪問」你可能無法訪問的內存 – ShinTakezou

回答

3

您正在輸入爲char並打印爲int。這就是你看到差異的原因。

當你把23char,它們被存儲爲這些數字它們的ASCII值0x320x33(或5051十進制)。當您將它們打印爲整數時,您將這些字節讀取爲整數,這將解釋您的輸出。

另外,您使用的||運營商不是bitwise OR,它是Logical OR。邏輯或只能產生10,具體取決於操作數值是零還是非零。相反,按位OR會對變量的每個位進行逐位或操作,這可能是您想要的。

UPDATE:(答案在評論你的問題)

1)打印出來的文字,你需要將整數轉換成字符串char。我會給你一個提示:

Character  Corresponding ASCII Value(decimal) 

    '0'      48 
    '1'      49 
    '2'      50 
... 
    '9'      57 

2)打印出來爲十六進制,既然你已經掃描他們作爲int只使用%x。 (在Linux上爲%hhx

+1

對不起,但我怎樣才能在同一時間將它們打印爲字符和十六進制? – Salahuddin

5

的問題是在這裏:

scanf("%c %c",&a,&b); 

查找文檔中的scanf(),看看%c應該是。你會發現它不是一個整數。所以即使你輸入了23,格式說明符在你的情況下以一種意想不到的方式對待它。一旦你明白了什麼%c那麼,其餘的將是明確的。

+0

所以我不能使用%c讀取數字,它是否必須是%i? 原因我瞭解到一個字符可能用在短號 – Salahuddin

+0

@Salahuddin,正確的,你必須使用'%i'格式說明符來表示你正在讀取一個數字而不是* *字符* – Nim

+0

@Salahuddin:如果你在Linux,你可以使用'%hhu'或'%hhd',這取決於你想要'unsigned'或'signed'整數值。 –