进制与编码
来源:互联网 发布:轮回转世是真的吗 知乎 编辑:程序博客网 时间:2024/06/05 06:30
数字系统采用二进制
必然性
特点
数位存储的有限性
用二进制编码表示数字
用二进制编码表示数字,即一个数字的表示的问题。这本身就是一个设计的过程,有一定的自由度。(都用)
设计原则(目标)
- 包含负数,编码与数字一一对应
- 连续
- 便于运算
最关键的是第三点,连续即可以理解为能很自然地过渡到下一个数字。
设计限制
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+(2n−1 )(而不是通常所说的y=(2n−1)−|x| ) - 只有不溢出,补码的运算完全和无符号数相同。只要证明
[x+y]=[x]+[y] - 其他设计示例:1001~1000,从-7到8,同样完美,唯一看起来不舒服的一点就是代表8的1000最高位是1
反码的循环进位
反码的不自然不彻底的平移决定了它蹩脚的运算。不彻底的平移导致了0有两种表示,进而导致出现两个BUG,
- 1110+0001=1111(-1+1=0),1110+0010=0000(-1+2=0)
- 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
- 进制与编码
- 16进制编码与字符编码的相互转化
- 编码与码制
- 编码与编码格式?
- 16进制编码与字符串的互相转化
- 16进制编码与字符串的互相转化
- 以考带学计算机组成原理(进制与编码)
- 编码规则与码制区别
- 响应编码、请求编码与URL编码
- 文件编码与字符编码
- unicode编码与utf8编码
- 硬编码与硬编码
- CBR编码与VBR编码
- ASCII编码与Unicode编码
- URL编码与反编码
- ASCII编码与Unicode编码
- 地理编码与反编码
- CBR编码与VBR编码
- 依赖项属性的组成
- 安卓基础总结 intent activity 页面间传递信息
- 《从0到1》读书笔记第3章“所有成功的企业都是不同的”第1记:成功企业垄断,失败企业竞争
- 黑马程序员——7k面试题—银行业务调度问题
- IOS之方法混写(swizzling.)
- 进制与编码
- .net源码摘录,已展开
- 九度OJ-1138-大数的求余
- 实现一个通讯录(数组实现)
- 安卓基础总结 Service相关
- 在RegisterCommon()函数
- leetcode Sort List
- IOS 隐藏键盘
- 黑马程序员——Java基础->基础语法(下)