奇怪的结果是c中的按位程序

时间:2014-01-07 10:20:11

标签: c bit-manipulation

编写下面的代码给我奇怪的答案

#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并且效果很好?!

2 个答案:

答案 0 :(得分:5)

问题在于:

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

查看scanf()的文档,看看%c应该是什么。你会发现它不是一个整数。因此,即使您输入23,格式说明符也会在您的情况下以意外方式处理此问题。一旦你理解了%c是什么,其余的就会清楚。

答案 1 :(得分:3)

您正在输入char并打印为int。这就是你看到差异的原因。

当您将23作为char时,它们将存储为0x320x33(或{{50这些数字的ASCII值1}}和51十进制)。当您将它们作为整数打印时,您将这些字节读取为整数,这将解释您的输出。

此外,您使用的||运算符不是bitwise OR,而是Logical OR。逻辑OR只能生成10,具体取决于操作数值为零或非零。相反,Bitwise OR会对变量的每个位进行逐位OR运算,这可能是您想要的。

更新:(在评论中回答您的问题)

1)要将它们打印为字符,您需要将整数转换为char字符串。我会给你一个提示:

Character        Corresponding ASCII Value(decimal)

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

2)要将它们打印为十六进制,因为您已经将它们扫描为int,只需使用%x。 (Linux上的%hhx