在学习原码,反码和补码之前,需要先了解机器数和真值的概念

一、机器数

一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号,正数为0,负数为1

比如,十进制中的数 +3,计算机字长为8位,转换成二进制就是00000011。如果是-3,就是 10000011

那么,这里的00000011和10000011就是机器数。

二、真值

因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数10000011,其最高位1代表负,其真正数值是-3而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值

例:

0000 0001的真值=+000 0001=+1

1000 0001的真值= –000 0001=–1

三、定点数的表示

在具体讲解之前我先给大家看一张图

无符号数

定义:整个机器字长的全部二进制数值位,没有符号位

例:

1000 1100B=1x27+1x23+1x22=156D

(通常只有无符号整数,而没有无符号小数)

表示范围:0~2n-1

例:

8位二进制数,28中不同的状态,其中有28-1种数

0000 0000~1111 1111=1 0000 0000-1

等于0~255=28-1

附上2的次方表,供大家记忆

有符号数

概念:对于一个数, 计算机要使用一定的编码方式进行存储。原码,反码,补码、移码是机器存储一个具体数字的编码方式,而且计算机一般以补码形式进行储存

定点整数

定点小数

可以用原码、反码、补码三种方式表示定点整数、定点小数,还可以用移码来表示定点整数

若真值为x,则用[x]、[x]、[x]、[x],分别表示真值所对应的原码、反码、补码、移码

原码


定义:原码就是符号位加上真值的绝对值(0/1对应正/负),即用第一位表示符号,其余位(也称为尾数)表示值。

如果是8位二进制:

[+1]=0000 0001

[-1]=1000 0001

当原码为负数且为整数时也常写为:1,0000001

当原码为负数且为小数时也常写为:1.0000001

(正数也是如此,只是符号位为0)

表示范围

  • 若机器字长为n+1位,原码整数范围为-(2n-1)≤x≤2n-1(关于原点对称)
  • 若机器字长为n+1位,原码小数范围为-(1-2-n)≤x≤1-2-n(关于原点对称)

特殊值:真值为0时有+0和-0两种形式

反码


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

[+1]=[00000001]=[00000001]

[-1]=[10000001]=[11111110]

表示范围:(与原码一致)

注意:“反码”只是“原码”转变为“补码“的一个中间状态,实际中并没有什么作用

补码


定义:正数的补码是其本身,负数的补码是在其原码的基础上,符号位不变,其余按位取反得到反码后+1(即在反码的基础上+1)(同时要考虑二进制的进位)

[+1]=[00000001]=[00000001]=[00000001]

[-1]=[10000001]=[11111110]=[11111111]

表示范围

  • 若机器字长为n+1位,补码整数范围为-2n≤x≤2n-1(比原码多表示一个-2n
  • 若机器字长为n+1位,补码小数范围为-1≤x≤1-2-n(比原码多表示一个-1)

注意:补码的真值0只有一种表示形式([+0]=[-0]=00000000)将负数的补码转为原码方式与原转补一致,先尾数按位取反,后在末位+1

移码


定义:正数只用将符号位取反即可,其余尾数不变,在补码的基础上将符号位取反

例:

[x]=10010011

[x]=11101100

[x]=11101101

[x]=01101101

注意:移码只能表示定点整数

补码的移位运算


移位运算分为左移(<<)与右移(>>),其中会有些不同,接下我给大家解释一下

左移运算

方法:无论是正数还是负数,左边丢弃最高位,右边补齐0

而且左移一位相当于乘以2的1次方,左移n位相当于乘以2的n次方

右移运算

方法:如果最高位是0,则移动后最左边补0;如果最高位是1,则移动后最左边补1

右移一位相当于除2,右移n位相当于除以2的n次方

附件

参考文档:

位、字节、字、字长 | 二进制、十进制、八进制和十六进制的相互转换 | 原码、反码、补码_Sany 何灿的博客-CSDN博客_字长和字节的转换

原码,反码,补码详解-ziqiu.zhang -博客园 (cnblogs.com)