前往小程序,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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
漫谈计算机组成原理(八)原码、补码、反码
我们当然知道,计算机只能识别0和1,也就是我们所说的机器语言。所以在程序猿进化史中出现过一种非常NB的品种——机器语言程序猿,他们的程序是写在纸带上面的。但是这种生物存在的时间不长(我不知道还有没有真正意义上的机器语言程序猿),就被编译器取代了。因为计算机只能识别0和1,所以在计算机的运算过程中,参与运算的必然只有0和1两个数字。那么这小小的0和1,究竟是如何完成如此复杂多变的操作的呢?
roobtyan
2019/02/21
6620
漫谈计算机组成原理(八)原码、补码、反码
「硬核JS」数字之美
一直都在佛系更新,这次佛系时间有点长,很久没发文了,有很多小伙伴滴我,其实由于换工作以及搬家的原因,节奏以及时间上都在调整,甚至还有那么一小段时间有点焦虑,你懂的,现已逐渐稳定,接下来频率应该就会高了,奥利给~
isboyjc
2022/03/28
5.6K0
「硬核JS」数字之美
⭐️ 关键字深度剖析 ⭐️第三章(关键字sizeof\signed\unsigned&原反补\数据范围)
注:不要将sizeof误认为函数,虽然sizeof带有(),但是sizeof是操作符,关键字
用户9645905
2022/11/30
3620
⭐️ 关键字深度剖析 ⭐️第三章(关键字sizeof\signed\unsigned&原反补\数据范围)
一文读懂原码、反码与补码
二进制和十进制一样,也是一种进位计数制,但是它的基数是 2。二进制表达式中 0 和 1 的位置不同,它所代表的数值也不同。例如,二进制数 0000 1010 表示十进制数 10。一个二进制数具有两个基本特点:两个不同的数字符号,即 0 和 1,逢二进一。
阿宝哥
2020/01/14
2.9K0
一文读懂原码、反码与补码
数字逻辑基础:原码、反码、补码
以3为例,+3对应的二进制数是00000011,-3对应的二进制数是10000011。
WuShF
2023/03/01
6730
数字逻辑基础:原码、反码、补码
C语言:数据在内存中的存储
三种表⽰⽅法均有符号位和数值位两部分,符号位都是⽤0表⽰“正”,⽤1表⽰“负”,⽽数值位最 ⾼位的⼀位是被当做符号位,剩余的都是数值位。
逆向-落叶
2024/10/28
1160
C语言:数据在内存中的存储
Go 数据类型篇(四):基本数据类型之间的转化
通过前面两篇教程,学院君已经介绍完了 Go 语言中的基本数据类型,分别是布尔类型、整型、浮点型、复数类型、字符串和字符类型,此外,Go 语言还支持这些基本数据类型之间的转化,不过由于 Go 是强类型语言,所以不支持动态语言那种自动转化,而是要对变量进行强制类型转化。
学院君
2023/03/03
5710
Go 数据类型篇(四):基本数据类型之间的转化
软考:数值转换知识点详解
进制转换是数值转换的基础,涉及到不同数制之间的相互转换。在计算机科学中,二进制是最基本的数制,因为计算机内部使用二进制来存储和处理数据。然而,人类更习惯于使用十进制,而十六进制则因其简洁性在表示二进制数据时非常常用。
码事漫谈
2025/04/24
730
软考:数值转换知识点详解
《计算机组成原理》| 第六章 计算机的运算方法-运算器 知识梳理
             (1111…1) -2n+1 ≤x ≤2n-1 (0111…1)
Twcat_tree
2022/11/30
9480
《计算机组成原理》| 第六章 计算机的运算方法-运算器 知识梳理
计算机组成原理-计数制与定点数编码
设r进制数从左到右分别为 R(n) R(n-1) R(n-2) … R(1) R(0),则该进制数转换为十进制是
DearXuan
2022/03/22
1.2K0
计算机组成原理-计数制与定点数编码
数值信息的机器级存储
计算机中使用八位的块,或者说是「字节」,作为最小的寻址单元。你可以将整个存储器视作一个超大的「字节数组」,每个字节都有一个唯一的数字编号,这个编号就是所谓的地址,通过这个地址,我们可以唯一的确定一块数据。但是我们代码中定义的各种数值又是如何转换为二进制串存储在这些「字节」里面的呢?为什么两个整数相加之后的结果会变成负数?
Single
2018/03/14
1.3K0
数值信息的机器级存储
原码、反码、补码的正(nao)确(can)打开方式
IT可乐
2018/01/04
1.2K0
原码、反码、补码的正(nao)确(can)打开方式
计算机数据表示方法及工业标准IEEE754讲解教程
今天在这里和大家记录一下在计算机系统中各种数据的表示方式以及工业标准IEEE754的使用方法。
灰小猿
2020/09/23
8230
计算机数据表示方法及工业标准IEEE754讲解教程
数值问题
计算机里面关于数值的处理自有一套体系理论,与现实生活中我们所习惯使用的不太一样。如果对其不了解,在使用计算机的过程中便可能发生一些意想不到的错误。
rand_cs
2023/12/10
2350
【C语言】数据类型存储、原码,反码,补码
 如何看待内存空间的视角:int的类型创建一个变量(a),占了4个字节, float类型创建一个变量(b),同样也只是占了仅仅4个字节的空间。但是给变量a的是格式符%d是一个整形,而给变量b的是格式符%f是一个单精度浮点型。
謓泽
2022/12/12
5980
【C语言】数据类型存储、原码,反码,补码
深入理解计算机系统 第二章 笔记
大多数计算机使用 8位 (1byte) 作为最小的可寻址的内存地址 机器级程序将内存视为一个非常大的字节数组,称为 虚拟内存 内存的每个字节有唯一标识,称为 地址,所有可能地址的集合称位 虚拟地址空间
MashiroT
2022/10/28
3.3K0
深入理解计算机系统 第二章 笔记
为什么计算机中的负数要用补码表示?
在前面的文章里,我们聊到了计算机的冯·诺依曼架构的 3 个基本原则。其中第 1 个原则是计算机中所有信息都是采用二进制格式的编码。也就是说,在计算机中程序的数据和指令,以及用户输入的所有数据,计算机都需要把它们转换为二进制的格式,才能进行识别和运算。
用户9995743
2022/12/22
3.1K0
为什么计算机中的负数要用补码表示?
深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
IT可乐
2018/01/04
2.6K0
深入理解计算机系统(2.4)------整数的表示(无符号编码和补码编码)
基础野:细说原码、反码和补码
Brief                                说来惭愧虽然刚接触计算机时已经学过原码、反码和补码的内容,但最近重温时却发现“这是什么鬼东西”,看来当初只是应付了考试了而已。本篇将试图把他们说个明白,以防日后自己又忘记了。   在深入之前,我们先明确以下几点:   1. 本篇内容全部针对有符号数整数;   2. 对于有符号数整数,其在计算机中的存储结构是 符号位 + 真值域。其中符号位为0表示正数,1表示负数;   3. Q:既然已经有原码,那么为什么还要出现反码、补码等数值的编码
^_^肥仔John
2018/01/18
1.5K0
【码制】原码反码补码移码浮点数
学C语言的时候一定会用到printf("%d",a); 有的课程称%d为“占位符”,非常形象:%d替a占位,输出的时候a的值会替换%d的内容。 但也有课程称之为“转换规范”,官方称之为“format specifiers”格式说明符。 以我目前的文化水平,我更倾向于“转换规范”。 因为计算机中的数据都是以01的形式存储,你不知道这串01是什么意思。 以char类型的变量a为载体举个例子:
WuShF
2023/10/23
8450
【码制】原码反码补码移码浮点数
推荐阅读
相关推荐
漫谈计算机组成原理(八)原码、补码、反码
更多 >
LV.0
这个人很懒,什么都没有留下~
作者相关精选
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档