【问题标题】:Bit Flipping - How is the answer -61?位翻转 - 答案如何 -61?
【发布时间】:2017-05-07 11:30:01
【问题描述】:

我正在关注本教程:https://www.tutorialspoint.com/cprogramming/c_bitwise_operators.htm https://www.tutorialspoint.com/cprogramming/c_operators.htm

我很困惑 A 的开头是:A = 0011 1100(十进制中的 60)在使用 ~ 运算符翻转所有位时如何变为 -61。

我知道~A 将变为:1100 0011。根据我的计算,这个二进制数 1100 0011 等于十进制的 195。然而,根据 c 编程语言和教程,答案是十进制的 -61。

有人可以帮我理解吗?

感谢您阅读此问题。

【问题讨论】:

  • 195-256 = -61: 8 位类型的补码
  • 请显示您正在运行的确切代码,以便我们可以尝试重现问题而不是猜测。
  • 这应该不足为奇,因为(根据定义)-x = ~x + 1~x = -x - 1
  • @merlin2011 我正在尝试手动执行此操作。代码在上面的链接之一中。我在 IDE 中编写并编译了它。然后运行它,结果是-61。

标签: bit-manipulation bit


【解决方案1】:

当您翻转有符号正值的位时,您也会翻转较高位(在任何类型上)。

因此,当您打印该值时,您会得到一个负值。

使用无符号 8 位类型,你会得到你想要的:

#include <stdio.h>

int main()
{
   int x = 60;
   printf("%d\n",~x);
   char y = x;
   printf("%d\n",~y);
   unsigned char z = x;
   printf("%u\n",(unsigned char)~z);

   return 0;
}

结果:

-61
-61
195

对于整数和字符,你得到-61,但如果你使用无符号字符,你得到195,高位用于值而不是符号。

1100 0011195,当考虑所有具有相同含义的位(无符号)时。

1100 0011 签名为 100 0011=64+2+1=67 - 2^7=128 = -61

【讨论】:

  • 太棒了。但是你能解释一下我如何手动得到这个吗?就像 1100 0011 似乎意味着 195 时如何变成 -61 一样?有趣的是,unsigned char 在翻转时如何变成 195,就像我手动翻转位然后根据它计算出基数为 10 时得到的那样。 :)
  • @user3870315 你也手动得到了 -61,只需将这些位解释为 8 位有符号整数。
  • 我不知道该怎么做@harold。 0_o
  • @user3870315 几乎和往常一样,但对最高位使用负权重,所以 -128 表示 8 位,你会得到 -128 + 64 + 2 + 1
  • 这是一个很好的答案@harold。谢谢你的插话。:))))))
猜你喜欢
  • 2019-07-24
  • 1970-01-01
  • 2012-10-01
  • 2012-05-07
  • 2015-05-22
  • 2019-02-22
  • 1970-01-01
  • 2011-05-12
  • 1970-01-01
相关资源
最近更新 更多