【问题标题】:Bitoperation results not as expected位运算结果不如预期
【发布时间】:2026-01-31 09:45:02
【问题描述】:

这是这个简单的代码:

char a = '10';
char b = '6';
printf("%d\n", a | b);
printf("%d\n", a ^ b);
printf("%d\n", a << 2);

输出是

54
6
192

现在我的问题是,为什么会出现这些结果。我在纸上查了一下,我所拥有的是

1110 for a | b = 14
1100 for a ^ b = 12
00101000 for a << 2 = 40

那么为什么会有不同的结果呢?

【问题讨论】:

  • 提示:试试printf("%d, %d\n", a, b);。我想你的意思是char a = 10; char b = 6;

标签: c bit


【解决方案1】:

您正在声明:

char a = '10';
char b = '6';

在这种情况下,b00110110 (0x36),因为您声明的是一个字符,而不是一个整数。

我也不知道为什么 char a = '10'; 甚至可以工作,因为单引号 (') 仅用于创建单个字符文字,而您在那里声明了两个。

正确的做法应该是:

char a = 10;
char b = 6;
printf("%d\n", a | b);
printf("%d\n", a ^ b);
printf("%d\n", a << 2);

【讨论】:

  • 旁注:一些编译器接受整数“多字符常量”,但它们高度依赖于编译器/平台。比较*.com/questions/6944730/…
  • 是的,我是这么认为的。感谢您为我清理。
  • 那么 '10' 的 bit-repr 是什么?
  • 为了完整起见,多字符常量是实现定义的,但需要符合标准的编译器来处理它们。字符文字的类型为int,通常编译器将多字符常量的字符映射到int 中的字节。在这里查看更多信息:*.com/questions/6944730/…
  • @Saphire 它可能是 0x3130 或 12592,但由于您将其分配给 char,它会被截断为 0x30 或 48。
【解决方案2】:

您在纸上解决了 int 106 的问题,而不是 chars '10' = 49 or 48(多字符常量的解释取决于编译器)和 '6' = 54

【讨论】:

  • 如何解释多字符常量'10' 高度依赖于编译器。例如,在 OS X 上使用 Clang,它是 = 48,即第一个字符被忽略。
  • @MartinR;是的。已编辑。
  • 为什么是 49?你是怎么计算出来的?
  • @Saphire;编辑了我的答案。
  • 两者都是正确的@hacks,saphire 它完全依赖于编译器。大多数编译器会从右到左解释这个赋值,但有些编译器会从左到右。
【解决方案3】:

这是因为您将变量定义为 character(char) 但在笔记本中 您通过将它们视为 Integer(int) 来计算结果 如果您想要正确的答案,请尝试此代码并检查 -

int a = 10; 
int b = 6;
printf("%d\n", a | b);
printf("%d\n", a ^ b);
printf("%d\n", a << 2);

【讨论】: