原码/补码/反码/移码 知识梳理

一、认识几个基本概念

计算机的数存储在寄存器中,称寄存器的位数为机器字长

  • 有符号数:首位用来表示正负数,其余位表示数值
  • 无符号数:没有符号的数,每一位都用来表示数值
  • 机器数:把符号数字化的数为机器数,带符号,最高位存放正负号
  • 真值:机器数实际表示的数称为真值,有正负

二、原码/补码/反码/移码 基本概念

原码:符号位加上真值的绝对值,即第一位0为正数,1为负数,其余位表示数值

反码:正数的反码是其本身,负数的反码是在其原码的基础上符号位不变,其余位取反

补码:正数的补码是其本身,负数的补码是在其原码的基础上符号位不变,其余各位取反,最后再加1,即在反码的基础上加1

移码:无论正数和负数,都是在其真值的基础上加一个2N,N位其位数,在数轴上移码表示的范围恰好对应于真值表示的范围向轴的正方向移动2N,所以叫为移码;不管正负数,只要将其补码的符号位取反即可得到对应的移码

移码是用来比较数的大小,正数的原码/补码/反码都相同;负数的反码是在其原码的基础上除符号位外取反,补码是在反码的基础上+1,或在原码的基础上除符号位外取反加1

三、原码、反码、补码的使用原因

计算机使用原码计算时需要辨别符号位,硬件实现起来相对复杂,为了简化,增设以上概念,将符号位带入运算,并且只保留加法

例:对简单的减法运算 1-1

  原码:符号位参与运算的情况显然不对

1-1=1+(-1)=[0000 0001]+[1000 0001]=[1000 0010]=-2

  这里引入反码来计算减法:

1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]反+[1111 1110]反=[1111 1111]反=[1000 0000]原=0

  真值部分是正确的,但是0的符号位为1或者是0,两个编码表示一个数字,存在争议,0带符号是没有意义的,所以引入补码:恰好解决了0的问题和两个编码表示一个数字的问题。且可以表示原码和反码里不能表示的-128,存储的数值范围是[-2N-1,2N-1-1],原码反码范围[-2N-1-1,2N-1-1],程序中注意越界问题。

1-1=1+(-1)=[0000 0001]原+[1000 0001]原=[0000 0001]补+[1111 1111]补=[0000 0000]补=[0000 0000]原
(-1)+(-127)=[1000 0001]原+[1111 1111]原=[1111 1111]补+[1000 0001]补=[1000 0000]补

 四、深入 

1.同余的概念:

两整数a,b,若它们除以整数m所得余数相等,则a,b对于模m同余,记作a≡b(mod m);即a与b关于模m同余

2.负数取模:x mod y,即求x除以y的余数,等于x减去y乘以x与y的商的下界

x mod y =x-y*(x/y的下界);例: -3 mod 2=-3-2*(-3/2的下界)=-3-2*(-2)=4-3=1

3.同余数的反身性:

a≡a(mod m)

 同余数的线性运算定理

 若 a ≡ b (mod m),c ≡ d (mod m) 则有:(1)a ± c ≡ b ± d (mod m) ;(2)a * c ≡ b * d (mod m)

4.一个数的反码,实际上就是这个数对于一个膜的同余数,这个模就是对应二进制位数所能表示的最大值,相当于127个刻度转一轮,变减法为加法;

补码也能参与运算的原因:在反码的基础桑,增加了模的值,相当于每128个刻度转一轮。

猜你喜欢

转载自www.cnblogs.com/yuanerduo/p/12530505.html
今日推荐