数据存储之数字 补码余码反码辨析
解决计算机内部如何存储数字的问题学习笔记。
1
位的概念
一个0 和 1是一位,表示两种状态
2
位模式
一段位,一段序列。
通常8位一个字节
存储要解决的问题
1数字的正负
2数字的小数点
存储数字的两种基本模式
符号:多种方式
小数点:定点计数(数字当成整数,没有小数部分)和浮点计数(数字当成实数,有小数部分)
存储整数
整数可以认为是小数点位置固定的数字,小数点在最右边(用定点表示法存储)。
在这种方法下,小数点是假定的,并不存储,但用户和程序可以将整数作为小数部分为0的实数存储。例如,整数太大时,无法定义为整数存储。总之,整数通常采用定点表示法。
无符号表示法
没有符号的整数 转成2进制,不足的位数补0即可。
溢出问题
n位存储单元 存储的整数0到2^n-1
假如要存储的数字大还存入就会溢出。
比如 4位存储20 10100 这时候就会只读取四位 0100 读成4 而不是20
所以整形存储极限很好理解
-2^(n-1) 2^(n-1)-1一分为二
无符号整数存储效率高
符号加绝对值表示法 中间分一半 一半正一半负 出现两个零(略 这部分不够重要,用得少)
二进制补码表示法(很重要)
几乎所有计算机都使用二进制补码表示法来存储有符号整数。
这种存储方法,涉及到了反码运算
反码
全部位取反
补码
从右往左复制位直到有1被复制
反转剩余位
00110100 11001100
连续两次补码运算可以得到原来的数字
还有一种补码运算是先对他进行一次反码 再加上1得到结果。
二进制补码存储整数
先把整数转2进制
零或正数就正常储存
负数就补码储存
二进制补码还原整数
最左位为1取补码,最左位为0 不操作
我的理解:
一个不溢出的正整数存储进来,肯定前面要补零,所以零开头判断为正数,直接读取后面二进制码即可。
一个不溢出的负整数存储进来,前面一开始也补零但是补码存储,全部被反向成了1,1说明是负数,两次补码,回到本身,再取一次补码读取即可,很方便。
溢出问题在于一旦位数过多,正负判断失效。
-28
00011100
11100100
00001101
0开头为正直接读 13
11100110
1开头为负,补码
00011010
2+8+16
-26
二进制补码表示法的溢出
必须有补零的位置以供判断正负
n位 2^n个数字
理解:假设4位
最大正数0111 7 -2^(n-1)-1
零 0000 用0开头但不是正数 吞掉了一个正数位置
最小负数1000 -8 -2^(n-1)
存储实数
为什么要有浮点表示法
整数部分位太多 太大
小数部分位太多 太小
会造成精度严重受损因而允许小数点浮动,采用浮点表示法。
符号+位移量+定点数 (原型是科学计数法)
二进制 ± 1.yyyyyy 每个y 是0或者1
一定是1开头 隐含不存储
只需要存储
1符号
2指数
3尾数
尾数是带符号的小数部分,可以作为无符号数存储。
指数理论上说可以采取补码存储,但实际上用了一种新码 余码进行存储。
余码中 正负的整数都可以用无符号数存储。
表示正负的方式将正整数(一个偏移量)添加到每个数字里,将他们移到非负的一边 偏移量2^(n-1)-1 偏移比一半少一个量
什么意思?
理解:
比如 4位存储16个整数 可以用来表示-7到8的数,为了全变无符号 整体右移7(2^(n-1)-1)个变成了0-15
这就叫余7码 偏移量为7的偏移表示法
实际上采用的
单精度浮点数
1表示符号 8 表示指数 23表示尾数 32位
余127 码
双精度浮点数
1符号 11指数 52尾数 64位
余1023码
例
用余127码表示5.75
单精度表示法
例子
首先
5.75 化为101.11
1.1011*2^2
尾数1011
指数2
符号﹢
符号为正 0开头
指数 2 余127码
129 就是10000001
尾数1011+19个零
-161.875 余127码
161.875
161 10100001
0.875 111
10100001.111
1.0100001111* 2^7
-开头 1
7余127 134
10000110
1 10000110 01000001111补全0
-0.0234375余127
0.0234375
(0000011)
1.1*2^-6
-6+127
121 01111001
1 01111001 1补全0
逆运算不举例了
据此可以总结
余码 补码 反码 原码(绝对值符号码)
反码只是一种最基本的运算方式 全部取反
原码是储存整数基本思想 2^n中间分开 0 整数比负数少一个,但是会增添一位表达正负,
一个数字存储就会浪费一位内存
补码用作存储带符号整数,要点是两次取补变成原来的数,所以可以正数直接存储
负数一次补,用开头数判断正负, 溢出就体现在开头数失效。
余码是存储浮点数的指数用的,核心在偏移,一分为二以后直接把负的偏移为正的计算表示即可
浮点数上溢和下溢
这个数过于逼近0或者过于逼近无穷,超出了存储范围位数不够
最大范围自己思考解出。
0.0无法上述步骤存储,直接进行了规定。
位数太多会进行截断,产生截断误差。
教材:计算机科学导论
章节 :3.1 3.2 数据存储之数字存储