请说明输出

|
#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),则其中一个为“ wins”,这取决于您使用的是
|
还是
&
。 当您将这些位或或在一起时,将赢得1。但是,5在与-3中的0相同的位置具有0,因此该位通过OR操作不变。结果(
1111 1111 1111 1101
)仍与-3相同。 当您进行按位与运算时,零将获胜。但是,5中的1与-3中的1匹配,因此这些位不变地通过AND操作获得。结果仍然是5。     
5
的二进制文件--is->
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和5(有关如何做负数,请参见二进制补码) 提示:表示OR,&表示AND     
-3 = 0xFFFD = 1111 1111 1111 1101 5 = 0101,因此按位或不更改第一个参数(只是将一个与一个参数重叠),结果仍为-3 按位取1101和0101之间的coomon值,即0101 = 5 :)由于5 = 0000 0000 0000 0101,没有理由考虑-3中的所有尾随位     
如果您完全了解2的补数,那么您应该知道 如何写出2的补码中的3和5作为bit31 bit32 ... bit3n和bit51 bit52 .. bit5n 如何计算bit3i的结果| i = 0 ... n的bit5i 如何将结果转换回以10为底 那应该给您第一个答案,第二个与&相同。     
听说过德摩根定律... ???提示在链接中,它是该表的缩影,体现了逻辑的原始事实,这些事实被钉在主要语言编译器的语法中... 更令人担忧的是,您不具备CS101的基本知识并发布了此问题(很抱歉,如果您将此屈服,但不是),我真的不敢相信您正在使用C代码,而是讲过关于补数,按位逻辑的任何事情...这里有些错误...如果您的大学讲师没有告诉过您任何内容,请说讲师根本不应该讲课并找到另一份工作。...叹     

要回复问题请先登录注册