前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >CSAPP第二章(下)

CSAPP第二章(下)

作者头像
HeaiKun
发布于 2020-07-06 07:08:45
发布于 2020-07-06 07:08:45
6310
举报
文章被收录于专栏:HeaiKunHeaiKun

上一章学习了二进制数与其他进制数之间的转换还有数字在计算机里的存储方式,接下来了解数据的编码格式等知识点。

原码、反码、补码

在这之前先了解一下 原码、反码、补码的基础知识。 原码就是一个整数二进制表示,比如15转换成二进制就是1111,15的原码就是1111。 反码是在原码的基础上进行按位取反,比如数字11,原码是1011,其反码就是按位取反得到0100。 补码是在反码的基础上加上1,比如数字11,原码是1011,反码是0100,那么其补码就是0101。 具体这些原码反码补码分别有什么用,接下来你就知道了。

整数的编码

整数中分为有符号数和无符号数

无符号数

无符号数的编码可以使用一下公式来进行定义。

也就是说,无符号整数的编码表达方式就是用原码来表示的。不同类型的无符号整数的大小范围都是0到2^w-1。而且对于一个w位的数据,也就只能表示这么多个数。

有符号数

有符号数包含非负整数和负整数,其中非负整数和无符号数的编码一样,使用原码来表示,但是负整数就不能这样表示了,需要用补码的编码格式。 我们做一个简单的推导,在数学运算中,互为相反数的两个数相加等于0,那么在编码上,互为相反数的编码值使用二进制的加法相加也应该等于0,比如-1+1=0,使用4位的二进制简单表示,0 = 0000,1 = 0001,那么-1的二进制表示为0000-0001, 我们把0000看成高位溢出的10000的话,就可以得到-1的表示方式为1111,因为1111+0001=0000,因为高位溢出了无效了,所以在有限位数的数据类型中这样的等式是成立的。 我们知道1111=15,那么-1=1111 和15之间的冲突了怎么办?其实,对于有符号数来说 最高位是符号位,只表示是正是负。利用相反数的思维发现,负数的二进制表示方式补码就等于相应正数反码加1,即-1的补码1的反码加1。0001的反码1110加1得到1111。

总结一下: 无符号数没有符号位,数据大小范围较大,编码使用二进制原码。表示数据的总个数是2^w。 有符号数有符号位,数据大小范围较小,非负数使用原码编码,负数使用补码编码,表示数据的总个数是2^w。

有符号和无符号之间的转换

在C语言中强制转换有符号与无符号会发生什么呢? 数据的大小会变化,但是位模式不会变。也就是之前每一位上的数据在转换之后,每一位上该是0是0,该是1是1。重要的是转换之后原来的补码表示的数据现按照原码的方式去读,原来原码表示的数据,现在按补码的方式去读,数据的大小会发生变化,但是每一位上的数字是不变的。

浮点型数据

类比于十进制小数,小数点前面的数是10的n次方来算,小数点后面的数按10的-n次方来算。 对于二进制数来说,小数点前面的是2的n次方,小数点后面的是2的-n次方。 IEEE浮点标准规定了浮点数的表示方法及其运算方法。 单精度的类型有32位 分为三部分 1 8 23 分别对应S E M ,符号,阶码,尾数。 公式为:

对于阶码E有三种不同的情况:

  1. 规格化值
  2. 非规格化值
  3. 特殊值。
舍入

IEEE浮点格式定义可四种舍入方式:

  1. 向偶摄入
  2. 向0舍入
  3. 向下舍入
  4. 向上舍入

对于这几种舍入方式使用下表格来表示,不在详细介绍:

方式

1.40

1.60

1.50

2.50

-1.50

向偶数舍入

1

2

2

2

-2

向零舍入

1

1

1

2

-1

向下舍入

1

1

1

2

-2

向上舍入

2

2

2

3

-1

浮点数的强制转换
  • 从int转换为float,数字不会溢出,但可能会被舍入。
  • 从int或float转换成double,可以保留精确的数值。
  • 从double转换成float值可能溢出,还有可能被舍入。
  • float或double转换int,值将会向零舍入。

总结

这一章的内容大多数都是数学推导,比较枯燥,我也只是简单的总结一下大致内容,如果想要详细的了解这一块内容,一定要详细的研究一下这一章。这些基础的知识点还是很有用的,帮助更好的理解计算机的世界。

注:必须非常小心的使用浮点运算,因为浮点运算只有有限的范围和精度,而且并不遵守普遍的算术属性,比如结合性。

“《深入理解计算机系统》笔记”

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-10-28,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 HeaiKun 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
保存mysql InnoDB的auto_increment值另类方案
问题描述 mysql数据库有auto_increment这样一个特性,一般是用来设置Integer类型主键自增长。比如下面的代码: -- 刚创建表,该表没有AUTO_INCREMENT值 create table test( id int(11) primary key not null auto_increment, field1 varchar(40) not null default '' ) engine=InnoDB; show create table test\G; ... Creat
jeremyxu
2018/05/10
1K0
auto_increment 自增键的一些说明
auto_increment 问题: 原文: https://yq.aliyun.com/articles/59263?spm=5176.8091938.0.0.bjzoFN 官方文档:https
保持热爱奔赴山海
2019/09/18
7790
记一次Auto Increment故障
实际上本次故障的素材来自于朋友的朋友,虽然我并不是故障的亲身经历者,但即便只是作为旁观者,依然感觉有所收获,于是乎记录下来以馈读者。
LA0WAN9
2021/12/14
3790
MySQL重大Bug!自增主键竟然不是连续递增
AUTO_INCREMENT=2,表示下一次插入数据时,若需要自动生成自增值,会生成id=2。
JavaEdge
2021/10/18
2.7K0
主键索引就是聚集索引?MySQL 索引类型大梳理
之前松哥在前面的文章中介绍 MySQL 的索引时,有小伙伴表示被概念搞晕了,主键索引、非主键索引、聚簇索引、非聚簇索引、二级索引、辅助索引等等,今天咱们就来捋一捋这些概念。 1. 按照功能划分 按照功能来划分,索引主要有四种: 普通索引 唯一性索引 主键索引 全文索引 普通索引就是最最基础的索引,这种索引没有任何的约束作用,它存在的主要意义就是提高查询效率。 普通索引创建方式如下: CREATE TABLE `user` (   `id` int(11) unsigned NOT NULL AUTO_INC
江南一点雨
2022/03/22
2.4K0
我的MYSQL学习心得(一) 简单语法
使用MYSQL有一段时间了,由于公司使用SQLSERVER和MYSQL,而且服务器数量和数据库数量都比较多
跟着阿笨一起玩NET
2018/09/20
2.4K0
我的MYSQL学习心得(一) 简单语法
MySQL从删库到跑路_高级(一)——数据完整性
数据冗余是指数据库中存在一些重复的数据,数据完整性是指数据库中的数据能够正确反应实际情况。 数据的完整性是指数据的可靠性和准确性,数据完整性类型有四种: A、实体完整性:实体的完整性强制表的标识符列或主键的完整性(通过唯一约束,主键约束或标识列属性)。 B、域完整性:限制类型(数据类型),格式(通过检查约束和规则),可能值范围(通过外键约束,检查约束,默认值定义,非空约束和规则)。 C、引用完整性:在删除和输入记录时,引用完整性保持表之间已定义的关系。引用完整性确保键值在所有表中一致,不能引用不存在的值.如果一个键。 D、自定义完整性:用户自己定义的业务规则,比如使用触发器实现自定义业务规则。
良月柒
2019/03/19
1.9K0
重新整理AUTO_INCREMENT字段
节选择《Netkiller MySQL 手札》 13.9. 重新整理AUTO_INCREMENT字段 AUTO_INCREMENT 并非按照我们意愿,顺序排列,经常会跳过一些数字,例如当插入失败的时候,再次插入会使用新的值。有时会造成浪费,我们可以使用下面SQL重新编排AUTO_INCREMENT序列。 SET @newid=0; UPDATE mytable SET id = (SELECT @newid:=@newid+ 1); 使用max()查看最大值,然后使用 alter修改起始位置。 sele
netkiller old
2018/03/05
7570
MySQL自增主键详解「建议收藏」
2.InnoDB引擎的自增值,在MySQL5.7及之前的版本,自增值保存在内存里,并没有持久化。每次重启后,第一次打开表的时候,都会去找自增值的最大值max(id),然后将max(id)+步长作为这个表当前的自增值
全栈程序员站长
2022/09/06
6.1K0
MySQL自增主键详解「建议收藏」
MySQL存储引擎 InnoDB 介绍
InnoDB存储引擎提供了具有提交,回滚,和崩溃恢复能力的事务安全,对比MYISAM 的存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引。它的特点有如下:
星哥玩云
2022/08/17
1.3K0
MySQL存储引擎 InnoDB 介绍
MySQL重新设置auto_increment值
通常,我们都会在数据库表中设置一个自增字段作为主键,该字段的值会随着添加新记录而自增。 同时也必须注意,这个自增字段的值只会一直增加,即使把记录删除了,该自增字段的值也不会变小。 因此,就会产生一个现象:假如某些记录被物理删除了,那么表中记录的这个自增字段值就不是连续的。 即:通过某个自增值去查询的时候表里并不存在该记录。
编程随笔
2022/04/29
2.2K0
MySQL主键自增值为什么有“空洞”?
本文在测试 insert、insert ignore、replace into 三种数据插入方式的时候,发现插入数据的时候在表内存在带有“唯一特性”的值重复的情况下三种语句的处理方式。最终发现了MySQL主键自增值“空洞”了
GreatSQL社区
2023/02/23
2.3K0
MySQL(数据类型和完整约束)
default默认值,创建列时可以指定默认值,当插入数据时如果未主动设置,则自动添加默认值
全栈程序员站长
2022/07/21
1K0
浅析MySQL存储引擎序列属性
墨墨导读:为了达到标识的目的,许多应用程序需要生成唯一编号,比如:商品编号、交易流水号等。MySQL数据库同样能够支持这样的需求场景,AUTO_INCREMENT就是为MySQL实现序列的方式,它会自动生成序列编号。
数据和云
2020/09/14
1.6K0
MySQL auto_increment问题
auto_increment 问题: https://yq.aliyun.com/articles/59263?spm=5176.8091938.0.0.bjzoFN https://dev.my
保持热爱奔赴山海
2019/09/17
9160
MySQL下的DB link
在实际工作中,我们可能会遇到需要操作其他数据库实例的部分表,但又不想系统连接多库。此时我们就需要用到数据表映射。如同Oracle中的DBlink一般,使用过Oracle DBlink数据库链接的人都知道可以跨实例来进行数据查询,同样的,Mysql自带的FEDERATED引擎完美的帮我们解决了该问题。本篇文章介绍FEDERATED引擎的开启和使用。
MySQL技术
2019/09/08
2.4K0
第三章《数据表的基本操作》
1.关于表 表示数据库存储数据的基本单位。一个表可以包含若干个字段或者是记录。表的操作包括创建表、修改表、删除表。创建数据表的过程是规定数据列的属性的过程,同时也是实施数据完整性约束的过程。 1.创建表: 数据表属于数据库,在创建数据表之前,应该使用“USE <数据库名>”移动到指定的数据库下。 如果没有选择数据库,创建表时会报错; 创建表的语法: CREATE TABLE table_name ( 字段1 数据类型 [完整性约束条件], 字段2 数据类型 [完整性约束条件], … );
互联网-小阿宇
2022/11/21
1.2K0
第三章《数据表的基本操作》
【重学 MySQL】六十五、auto_increment 的使用
在 MySQL 中,AUTO_INCREMENT 属性用于在一个表中生成唯一的数字序列,通常用于主键(Primary Key)字段。它确保每次插入新记录时,该字段的值会自动递增,从而避免手动设置重复值。
用户11332765
2024/10/28
3060
【重学 MySQL】六十五、auto_increment 的使用
MySQL中的约束和存储引擎
在创建表的时候,可以给表的字段添加相应的约束,添加约束的目的是为了保证表中数据的合法性、有效性、完整性。 常见的约束有哪些呢?
共饮一杯无
2022/11/28
2.1K0
MySQL中的约束和存储引擎
MySQL实战第三十九讲-自增主键为什么不是连续的?
在 第4篇 文章中,我们提到过自增主键,由于自增主键可以让主键索引尽量地保持递增顺序插入,避免了页分裂,因此索引更紧凑。
越陌度阡
2022/11/27
1K0
MySQL实战第三十九讲-自增主键为什么不是连续的?
相关推荐
保存mysql InnoDB的auto_increment值另类方案
更多 >
目录
  • 原码、反码、补码
  • 整数的编码
    • 无符号数
    • 有符号数
    • 有符号和无符号之间的转换
  • 浮点型数据
    • 舍入
    • 浮点数的强制转换
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档