原码、反码、补码

        由于计算机运行时是按照补码的方式来运算的,所以在运算前我们应该找出对应的补码,然后再进行运算

1、二进制中的原码、反码、补码

        (1)对于有符号而言:

                1)二进制中的最高位是符号位:0表示正数,1表示负数

                2)正数的原码、反码、补码都一样(三码合一)

                3)负数的反码=它的原码符号位不变,其他位取反

                4)负数的补码=它的反码加1,那么,负数的反码就等于它的补码减1

                5)0的反码是0

                6)在计算机运行的时候,都是以补码的形式来运行的

2、习题

        (1)int a = 1 >> 2

        1的原码、反码、补码都是00000000 00000000 00000000 00000001

        右移是左边舍弃,右边补0:00000000 00000000 00000000 00000000

        (2)int b = -1 >> 2

        -1的原码是:100000000 00000000 00000000 00000001

                反码是:11111111 11111111 11111111 11111110

                补码是:11111111 11111111 11111111 11111111

        -1补码右移两位之后:11111111 11111111 11111111 11111111

        -1右移之后的反码:11111111 11111111 11111111 11111110

        -1右移之后的原码:100000000 00000000 00000000 00000001

        (3)int c = 1 << 2

        00000000 00000000 00000000 00000100

        (4)int d = -1 << 2

        -1原码:100000000 00000000 00000000 00000001

        -1反码:11111111 11111111 11111111 11111110

        -1补码:11111111 11111111 11111111 11111111

        -1 << 2:11111111 11111111 11111111 11111100

        -1左移之后的反码:11111111 11111111 11111111 11111011

        -1左移之后的原码:10000000 00000000 00000000 00000100

        (5)~2=-3

        正数三码合一,2的补码就是:00000000 00000000 00000000 00000010

        取反:11111111 11111111 11111111 111111101

        取反之后是负数,看不懂啊,怎么办?这个取反的结果依旧是个补码,还原就好了,既然负数的补码是它的反码加1,那么它的反码就等于补码减1。负数取反的时候符号不变,那么负数还原的时候,符号也不变

        反码:11111111 11111111 11111111 11111100

        原码:10000000 00000000 00000000 00000011

(6)2&3=2

        2的二进制:00000000 00000000 00000000 00000010

        3的二进制:00000000 00000000 00000000 00000011

        按位与的时候,同真为真。上面每一位按位与出来的结果如下:

                00000000 00000000 00000000 00000010(二进制)=2(十进制)

(7)2|3=3

        运算结果为:00000000 00000000 00000000 00000011(二进制)=3(十进制)

         按位或的时候,有真为真,无真为假。

(8)~-5=4

        -5原码:10000000 00000000 00000000 00000101

        -5反码:11111111 11111111 11111111 11111010

        -5补码:11111111 11111111 11111111 11111011

        -5取反:00000000 00000000 00000000 00000100(二进制)=4(十进制)

(9)-3^3=-2

        -3原码:10000000 00000000 00000000 00000011

           反码:11111111 11111111 11111111 11111100

           补码:11111111 11111111 11111111 11111101

        3补码:00000000 00000000 00000000 00000011

        异或的规则就是不同为真,相同为假。

        -3^3=11111111 11111111 11111111 11111110

        上面的异或结果为补码异或

        反码:11111111 11111111 11111111 11111101

        原码:10000000 00000000 00000000 00000010(二进制)=-2(十进制)

       

你可能感兴趣的:(c语言)