我正在关注本教程: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。
有人可以帮我理解吗?
感谢您阅读此问题。
答案 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 0011
为195
。
1100 0011
签名为100 0011=64+2+1=67
- 2^7=128
= -61