[英]Please explain output
#include<stdio.h>
int main(void)
{
int a=-3,b=5,c;
c=a|b;
printf("%d ",c);
c=a&b;
printf("%d ",c);
}
输出为-3 5
,请解释如何?
要了解输出,您需要熟悉用于表示负二进制数的二进制补码。 从+ x到-x的转换实际上非常容易:对所有位进行补码并加一位。 现在,假设您的int的长度为8位(足以检查5和-3):
5: 0000 0101
3: 0000 0011 => -3: 1111 1101
现在让我们看一下按位或:
1111 1101 | 0000 0101 = 1111 1101
正好代表-3
现在按位与:
1111 1101 & 0000 0101 = 0000 0101
完全是5的二进制表示形式
当您同时查看二进制表示形式时,它会有所帮助:
-3 == 1111 1111 1111 1101
+5 == 0000 0000 0000 0101
需要明白的一点是,无论|
如果两边的值相同,则&
将单独保留。 如果值不同(即,一个操作数在该位置为0,另一个操作数为1),则其中一个“获胜”,这取决于您是否使用|
或&
。
当您将这些位或或在一起时,将赢得1。 但是,5在与-3中的0相同的位置具有0,因此该位通过OR操作不变。 结果( 1111 1111 1111 1101
)仍与-3相同。
当您进行按位与运算时,零将获胜。 但是,5中的1与-3中的1匹配,因此那些位不变地通过AND操作获得。 结果仍然是5。
5
二进制数-是-> 0000 0101
3 --> 0000 0011
1's Complement
-> 1111 1100
2's Complement (add 1)
-> 1111 1101
== -3。 这是将其存储在内存中的方式。
按位或真值表:
p OR q
p || q || p | q
T(1) || T(1) || T(1)
T(1) || F(0) || T(1)
F(0) || T(1) || T(1)
F(0) || F(0) || F(0)
1111 1101
| 0000 0101
= 1111 1101
== -3
按位与真值表:
p AND q
p || q || p & q
T(1) || T(1) || T(1)
T(1) || F(0) || F(0)
F(0) || T(1) || F(0)
F(0) || F(0) || F(0)
1111 1101
& 0000 0101
= 0000 0101
== 5
另请参阅- 每位计算机科学家都应了解的浮点运算法则 。
-3 = 0xFFFD = 1111 1111 1111 1101 5 = 0101,因此按位或不更改第一个参数(只是将一个与一个参数重叠),结果仍然为-3
按位取1101和0101之间的coomon值,即0101 = 5 :)由于5 = 0000 0000 0000 0101,没有理由考虑-3中的所有尾随位
如果您完全了解2的补数,那么您应该知道
那应该给您第一个答案,第二个与&相同。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.