位翻转 - 答案如何-61?

时间:2016-12-21 22:28:31

标签: bit-manipulation bit

我正在关注本教程: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的-61。

有人可以帮我理解吗?

感谢您阅读此问题。

1 个答案:

答案 0 :(得分: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

表示整数&amp; char,你得到-61,但是如果你使用unsigned char,你得到195,更高的位用于值而不是sign。

在考虑具有相同含义(无符号)的所有位时,

1100 0011195

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