2.C语言 原码/反码/补码

1.二进制在内存中的不同表现形式

原码/反码/补码

2.正数的原码/反码/补码

9---->int类型----->占用4个字节---->1个字节就是8位  ----> 总共占用32位

00000000  00000000 00000000 00001001

对于正数来说,原码/反码/补码都他妈一样的

正数的原码/反码/补码三码合一

3.负数的原码/补码/反码

-9---->int类型----->占用4个字节---->1个字节就是8位  ----> 总共占用32位

10000000  00000000 00000000 00001001

二进制的最高位我们称之为符号位,如果是0,代表是一个正数,如果是1,代表是一个负数

3.1负数的原码就是负数的二进制

10000000  00000000 00000000 00001001

3.2负数的反码就是负数的二进制除了最高位按位取反

11111111  11111111 11111111 11110110

3.3负数的补码就是负数的反码+1

11111111  11111111 11111111 11110110+1=

11111111  11111111 11111111 11110111

1.为什么计算机要有原码,反码,补码

答:计算机只能做加法运算

1+1--> 1+1

1-1--> 1+(-1)

3*3--> 3+3+3

9/3 --> 9+(-3)+(-3)+(-3)

需求:要求计算 1-1的结果

//先用1的原码和-1的原码进行计算

    0000 0000 0000 0000 0000 0000 0000 0001      1         的   原码

 + 1000 0000 0000 0000 0000 0000 0000 0001      -1          的 原码

--------------------------------------------------------------------------------

    1000 0000 0000 0000 0000 0000 0000 0010         -2的原码

//先用1的反码和-1的反码进行计算

   0000 0000 0000 0000 0000 0000 0000 0001        1     反码

+ 1111  1111  1111 1111   1111 1111  1111 1110      -1       的反码

--------------------------------------------------------------------------------------------

  1111  1111 1111  1111   1111   1111  1111  1111             反码

  1000  0000 0000 0000 0000  0000  0000  0000           -0原码

//先用1的补码和-1的补码进行计算

     0000 0000 0000 0000 0000 0000 0000 0001         1的补码

+   1111  1111  1111  1111  1111  1111  1111  1111        -1的补码

---------------------------------------------------------------------------------------

1  0000 0000 0000 0000 0000 0000 0000 0000

因为只能存储32位,所以第33位的数据被丢弃

所以结果是

  0000 0000 0000 0000 0000 0000 0000 0000     0    √

需要知道的东西:

1.在计算机中存储的所有数据都是补码

2.在计算机中参与运算的都是补码

3.如果计算的结果是一个正数,那么直接将计算的结果转换为十进制就是我们想要的结果

如果计算的结果是一个负数,那么需要将计算的结果转换为原码,然后再转换为十进制才是我们想要的结果

4.原码如何转换为反码

符号位不变,其他按位取反

5.反码如何转换为补码

反码+1

6.补码如何转换为反码

补码-1

7.反码如何转换为原码

符号位不变,其他取反

计算机中参与运算的数据都是补码哦

9  - 6 --->  9 + (-6)

9的原码:0000 0000  0000 0000   0000 0000  0000 1001

9的反码:0000 0000  0000 0000   0000 0000  0000 1001

9的补码:0000 0000  0000 0000   0000 0000  0000 1001

-6的原码:1000 0000  0000 0000   0000 0000  0000 0110

-6的反码:1111 1111  1111 1111   1111 1111  1111 1001

-6的补码:1111 1111  1111 1111   1111 1111  1111 1010

    9的补码: 0000 0000  0000 0000   0000 0000  0000 1001

+  -6的补码:1111 1111  1111   1111    1111  1111  1111  1010

---------------------------------------------------------------------------------------

                  1 0000 0000  0000 0000   0000 0000  0000   0011

如果计算的结果是一个正数,那么直接将计算的结果转换为十进制就是我们想要的结果:3

4-6  ---->  4+ (-6)

4的原码:0000 0000  0000 0000   0000 0000  0000  0100

4的反码:0000 0000  0000 0000   0000 0000  0000  0100

4的补码:0000 0000  0000 0000   0000 0000  0000  0100

-6的原码:1000 0000  0000 0000   0000 0000  0000  0110

-6的反码:1111 1111  1111 1111   1111 1111  1111  1001

-6的补码:1111 1111  1111 1111   1111 1111  1111  1010

        4的补码:0000 0000  0000 0000   0000 0000  0000  0100     

 +     -6的补码:1111 1111  1111 1111   1111 1111  1111  1010

------------------------------------------------------------------------------------

           结果: 1111 1111  1111 1111   1111 1111  1111  1110             

计算的结果是一个负数,那么需要将计算的结果转换为原码,然后再转换为十进制才是我们想要的结果:

1111 1111  1111 1111   1111 1111  1111  1101

1000 0000  0000 0000   0000 0000  0000  0010

结果:-2

上一篇:C语言----数据类型与表达式(进阶篇十六)


下一篇:[数据库基础]——索引详解