数据存储之数字

数据存储之数字 补码余码反码辨析

解决计算机内部如何存储数字的问题学习笔记。

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 数据存储之数字存储

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值