关于为什么负数的补码为符号位不变各位取反加

  数在计算机中是以二进制形式表示的。

  数分为有符号数和无符号数。

  原码、反码、补码都是有符号定点数的表示方法。

  一个有符号定点数的最高位为符号位,0是正,1是副。

  以下都以8位整数为例,

  原码就是这个数本身的二进制形式。

  例如

  0000001 就是+1

  1000001 就是-1

  正数的反码和补码都是和原码相同。

  负数的反码是将其原码除符号位之外的各位求反

  [-3]反=[10000011]反=11111100

  负数的补码是将其原码除符号位之外的各位求反之后在末位再加1。

  [-3]补=[10000011]补=11111101

  一个数和它的补码是可逆的。

  为什么要设立补码呢?

  第一是为了能让计算机执行减法:

  [a-b]补=a补+(-b)补

  第二个原因是为了统一正0和负0

  正零:00000000

  负零:10000000

  这两个数其实都是0,但他们的原码却有不同的表示。

  但是他们的补码是一样的,都是00000000

  特别注意,如果+1之后有进位的,要一直往前进位,包括符号位!(这和反码是不同的!)

  [10000000]补

  =[10000000]反+1

  =11111111+1

  =(1)00000000

  =00000000(最高位溢出了,符号位变成了0)

  有人会问

  10000000这个补码表示的哪个数的补码呢?

  其实这是一个规定,这个数表示的是-128

  所以n位补码能表示的范围是

  -2^(n-1)到2^(n-1)-1

  比n位原码能表示的数多一个

  又例:

  1011

  原码:01011

  反码:01011 //正数时,反码=原码

  补码:01011 //正数时,补码=原码

  -1011

  原码:11011

  反码:10100 //负数时,反码为原码取反

  补码:10101 //负数时,补码为原码取反+1

  0.1101

  原码:0.1101

  反码:0.1101 //正数时,反码=原码

  补码:0.1101 //正数时,补码=原码

  -0.1101

  原码:1.1101

  反码:1.0010 //负数时,反码为原码取反

  补码:1.0011 //负数时,补码为原码取反+1

  总结:

  在计算机内,定点数有3种表示法:原码、反码和补码

  所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

  反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处://a/jrrd/20200703-613.html