进制与编码

来源:互联网 发布:轮回转世是真的吗 知乎 编辑:程序博客网 时间:2024/06/05 06:30

数字系统采用二进制

必然性

特点

数位存储的有限性

用二进制编码表示数字

用二进制编码表示数字,即一个数字的表示的问题。这本身就是一个设计的过程,有一定的自由度。(都用)

设计原则(目标)

  1. 包含负数,编码与数字一一对应
  2. 连续
  3. 便于运算
    最关键的是第三点,连续即可以理解为能很自然地过渡到下一个数字。

设计限制

1.数位的有限性
2.习惯方式:0000表示0,0001表示1

设计示例:补码(2’s complement),反码(1s’ complement)及其他

观点:补码比反码更自然。

  • 习惯思路:正数取反得相应负数的反码,正数取反+1得相应负数的补码。实际上,这是操作的思路,并不是一个自然的设计思路。
  • 另一种思路:从正数0~2^n-1到包含负数,如何确立负数与原正数的一一对应关系——平移。可以用两种方法思考:圆和线段
  • 圆:数位的有限性决定了任何一种编码都是有一定的表示范围的,这在取模的意义上得到了循环。1111后重新回到0000

  • 线段

  • 怎样平移决定了怎样的对应关系。补码的平移方式决定的对应关系是y=x+2n(而不是通常所说的y=2n|x|),反码的平移方式决定的对应关系是y=x+(2n1)(而不是通常所说的y=(2n1)|x|
  • 只有不溢出,补码的运算完全和无符号数相同。只要证明[x+y]=[x]+[y]
  • 其他设计示例:1001~1000,从-7到8,同样完美,唯一看起来不舒服的一点就是代表8的1000最高位是1

反码的循环进位

反码的不自然不彻底的平移决定了它蹩脚的运算。不彻底的平移导致了0有两种表示,进而导致出现两个BUG,

  1. 1110+0001=1111(-1+1=0),1110+0010=0000(-1+2=0)
  2. 1110+1111=1101(-1+0=-2),1110+1110=1100(-1+-1=-3)

这两个BUG分别代表了循环进位的两种情形:x<0且y<0;x<0,y>0,|x|<|y|
可以分类讨论严格证明循环进位。
如果我们承认反码的次要性,我们根本无需研究反码,根本不用关心反码的运算和所谓的循环进位。

溢出

  • 无论何种编码方式,溢出的概念都是相同的,而且很简单。因为存储数位有限的限制,编码有各自的表示范围,a

减法

我们不研究减法,因为所有的减法可以归结为加法(加相反数),但是对于补码来说,存在一个BUG,即减-8。-8的补码仍然是-8

0 0
原创粉丝点击