带符号二进制数的二进制表示
常用机器码:原码、反码、补码、移码
原码
求法:除二取余,倒序依次排列
x=(25)10=[11001]原码
零的表示有“+0”和“-0”之分
[0000 0000]
[1000 0000]
正数的原码是其本身,负数的原码符号位为1,数值位不变
原码的加法
十进制运算: (1)10+(1)10=(2)10
二进制运算:
(1)10+(1)10
=[0000 0001]原码 +[0000 0001]原码
=[0000 0010]原码
=(2)10 一致
十进制运算: (-1)10+(-1)10=(-2)10
二进制运算:
(-1)10+(-1)10
=[1000 0001]原码 +[1000 0001]原码
=[10000 0010] 原码
=???数值位和符号位怎么确定?
原码的减法
十进制运算:(1)10-(1)10 =(0)10
二进制运算:
(1)10-(1)10
=(1)10+(-1)10
=[0000 0001]原+[1000 0001]原
=[1000 00100]原
=(-2)10 不正确啊
十进制运算:(1)10-(2)10 =(-1)10
二进制运算:
(1)10-(2)10
=(1)10+(-2)10
=[0000 0001]原+[1000 0010]原
=[1000 00011]原
=(-3)10 不正确啊
结论:原码不能直接进行减法运算
正确做法:
1、当对两个数求和时,如果符号相异,则需要先比较两个数的绝对值的大小,然后做减法。
2、绝对值大的符号是结果的符号。
3、绝对值的差值是结果的数值位。
缺点:利用它进行加减运算比较麻烦
简化加减运算
解决办法:减法变加法,符号位直接参与运算
原码不能够解决,也就出现了反码
反码表示法
符号位与原码相同
数值位与符号位相关
正数的反码是正数本身,与原码形式相同
负数的反码符号位为1,其余部分数值部分按位取反得到。
例如:
若x1=+0.1011 [x1]反码=0.1011
若x2= -0.1011 [x2]反码=[x1]符号位为1,其余部分是原码数值部分按位取反得到
[x2]反码=[2-2^(-4)]-0.1011
=1.1111-0.1011
=1.0100
若x1=+0.1011 [x1]反码=0.1011
若x2= -0.1011 [x2]反码=1.0100
求x=-13/16的二进制反码?
首先把 13转成二进制 1101
然后除以16(16=2^4),也就是小数点向左移动4位。
[x]反=[-0.1101]反=1.0010
反码的正负0
[+0]反=0.0...0
[-0]反=1.1...1
0不是唯一的。。怎么解决?
负数反码的加法
十进制运算: (-1)10+(-1)10=(-2)10
二进制运算:
(-1)10+(-1)10
=[1000 0001]原码 +[1000 0001]原码
=[1111 1110]反码 +[1111 1110]反码
=[11111 1100] 反码
=[11111 1101] 反码 -->进位加到末位(最低位)进位也就溢出了,不参加计算。
=[11000 0010] 原码
=(-2)10
反码的减法
十进制运算: (1)10-(2)10=(-1)10
二进制运算:
(1)10-(2)10
=(1)10+(-2)10
=[0000 0001]原码 +[1000 0010]原码
=[0000 0001]反码 +[1111 1101]反码
=[1111 1110] 反码
进位加到末位(最低位)进位也就溢出了,不参加计算。没有进位不作处理。
=[1000 0001] 原码
(-1)10
十进制运算: (1)10-(1)10=(0)10
二进制运算:
(1)10-(1)10
=(1)10+(-1)10
=[0000 0001]原码 +[1000 0001]原码
=[0000 0001]反码 +[1111 1110]反码
=[1111 1111]反码
=[1000 0000]原码
=(-0)10
0不是唯一的。。。不正确(有负零)
怎么解决0的唯一性?就引入了补码表示法
补码
补码的设计目的是:
使符号位能与有效值部分一起参加运算,从而简化运算规则
“模”是指一个计量系统的计数范围
补码表示法:
符号位与原码相同
负数的补码的符号位为1,数值位为反码的末尾加1
负数的补码简单的说就是:符号位不变,数值位逐位取反,末尾加1
例如:[-1010]补码=[-1010]反码+1=10101+1=10110
对于0,在补码中只有一种形式:
[+0.0...0]补码=[-0.0...0]补码=0.0...0
补码的意义
1、计算机中的数据受字长的限制,数据的运算属于有模运算
2、计算结果直接丢掉进位
3、可以将减法转换为加法运算
4、计算机中可只设置加法器,从而简化设计,降低成本
举例
若x=0.1010 则[x]补码=0.1010
若x=-0.1010 则
[x]补码=[x]反码+1=1.0101+1=1.0110
若x=1010 则[x]补码=01010
若x=-1010 则
[x]补码=[x]反码+1=10101+1=10110
总结:
正数的原码、反码、补码都是一样的。
负数的原码、反码、补码都是不一样的。
负数补码的加法
十进制运算: (-1)10+(-1)10=(-2)10
二进制运算:
(-1)10+(-1)10
=[1000 0001]原码 +[1000 0001]原码
=([1111 1110]反码+1) +([1111 1110]反码+1)
=[1111 1111]补码 +[1111 1111]补码
=[11111 1110] 补码 -->(补码=反码+1)
=[1111 1110] 补码 -->符号位进位直接丢掉。
=[1111 1101]反码 (反码=补码-1)
=[1000 0010] 原码 -->(原码<-->反码=补码-1)
=(-2)10
补码的减法
十进制运算: (1)10-(2)10=(-1)10
二进制运算:
(1)10-(2)10
=(1)10+(-2)10
=[0000 0001]原码 +[1000 0010]原码
=[0000 0001]补码 +([1111 1101]反码+1)
=[0000 0001] 补码 +[1111 1110] 补码
=[1111 1111] 补码
=[1111 1110]反码 (反码=补码-1)
=[1000 0001]原码
=(-1)10
十进制运算: (1)10-(1)10=(0)10
二进制运算:
(1)10-(1)10
=(1)10+(-1)10
=[0000 0001]原码 +[1000 0001]原码
=[0000 0001]补码 +([1111 1110]反码+1)
=[0000 0001] 补码 +[1111 1111] 补码
=[10000 0000] 补码
=[0000 0000] 补码 -->符号位进位直接丢掉。
=[0000 0000]原码 (正数的原码、补码相同)
=(0)10
解决了0不唯一的问题
移码(又叫增码)
移码(又叫增码或偏置码)通常用于表示浮点数的阶码,其表示形式与补码相似,只是其符号位用“1”表示正数,用“0”表示负数,数值部分与补码相同。
计算机移码就是在原有的补码的基础上对于符号取反。对于8位存储数字,例如:-1的补码是165311111111,它的移码就是01111111;
移码,就是在原码的基础上加上一个偏移量。
阶码
在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码,阶码指明了小数点在数据中的位置。
浮点数的表示中用移码表示阶码
浮点数的表示中为什么要用移码表示阶码?