编写下面的代码给我奇怪的答案
#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并且效果很好?!
答案 0 :(得分:5)
问题在于:
scanf("%c %c",&a,&b);
查看scanf()
的文档,看看%c
应该是什么。你会发现它不是一个整数。因此,即使您输入2
和3
,格式说明符也会在您的情况下以意外方式处理此问题。一旦你理解了%c
是什么,其余的就会清楚。
答案 1 :(得分:3)
您正在输入char
并打印为int
。这就是你看到差异的原因。
当您将2
和3
作为char
时,它们将存储为0x32
和0x33
(或{{50
这些数字的ASCII值1}}和51
十进制)。当您将它们作为整数打印时,您将这些字节读取为整数,这将解释您的输出。
此外,您使用的||
运算符不是bitwise OR
,而是Logical OR
。逻辑OR只能生成1
或0
,具体取决于操作数值为零或非零。相反,Bitwise OR会对变量的每个位进行逐位OR运算,这可能是您想要的。
更新:(在评论中回答您的问题)
1)要将它们打印为字符,您需要将整数转换为char
字符串。我会给你一个提示:
Character Corresponding ASCII Value(decimal)
'0' 48
'1' 49
'2' 50
...
'9' 57
2)要将它们打印为十六进制,因为您已经将它们扫描为int
,只需使用%x
。 (Linux上的%hhx
)