加载中...
加载中...
带符号二进制数的二进制表示

带符号二进制数的二进制表示 原创

带符号二进制数的二进制表示

常用机器码:原码、反码、补码、移码

原码

求法:除二取余,倒序依次排列

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;

移码,就是在原码的基础上加上一个偏移量。

阶码

在机器中表示一个浮点数时需要给出指数,这个指数用整数形式表示,这个整数叫做阶码阶码指明了小数点在数据中的位置。 

 

浮点数的表示中用移码表示阶码

浮点数的表示中为什么要用移码表示阶码?



没有更多推荐了 [去首页]
image
文章
357
原创
284
转载
73
翻译
0
访问量
199056
喜欢
47
粉丝
6
码龄
5年
资源
0

文章目录

加载中...
0
0