计组-数据的表示和运算学习笔记

数制与编码

THGz4I.png
进制
THw3Ss.png

十进制转换为任意进制数

常采用基数乘除法,这种转换方法对十进制数的整数部分和小数部分将分别进行处理

对整数部分采用除基取余法(先余为低位,后余为高位)

对小数部分采用乘基取整法(先整为高位,后整位低位)

十进制数转为任意进制数
定点数的编码表示

定点数表示小数和整数,主要有编码表示法:原码、补码、反码和移码

其中原码和反码表示整数时,都会产生正负零,在位数相等的情况下所表示数的范围比补码表示整数的范围少一个

正数形式下的 原码,反码,补码都是相同的,只是负数形式不一致

TLNvHf.png

TLwOJS.png

移码的一个重要性质:当真值不断增大时,移码也在不断增大

移码主要用于表示阶数

无符号整数和带符号整数

运算方法和运算电路

基本运算部件

在计算机中,运算器由算术逻辑单元(ALU)、移位器、状态寄存器和通用寄存器组等组成

ALU的核心部件是加法器

ALU是一种功能较强的组合逻辑电路,它能进行多种算术运算和逻辑运算。

由于加、减、乘、除运算最终都可以归结为加法运算,因此ALU的核心是带标志加法器

定点数的移位运算

1️⃣算术移位(针对带符号数)

  • 原码的算术移位

    TOV1Ln.png
  • 反码的算术移位

    TOZSwq.png
  • 补码的算术移位

    补码的最右边的第一个1的右边可看作是原码

    补码最右边的第一个1的左边可看作是反码

    TOZnTx.png

2️⃣逻辑移位(针对无符号数)

TOdvwt.png

3️⃣循环移位

循环移位分为带进位标志位CF的循环移位(大循环)和不带进位标志位的循环移位(小循环)

循环移位
定点数的加减运算

原码实现减法运算在电路上比较困难,主要是采用补码进行减法运算

TOBKsJ.png

补码的加减法运算

将减法运算也看成是 加法运算,

将A-B 转为 A+(-B)的补码进行加法运算

按二进制运算规则计算,逢二进一

符号位和数值位一起参与运算

TOsCse.png

溢出判断

只有 两个正数相加 变成 负数 代表上溢 。 两个负数相加 变成正数 代表下溢

从符号的角度来看:就是两个相同的符号的数字进行加法操作,得出的结果是不同的符号,即代表溢出了(计算出错了)

有3种 判断补码加减运算是否溢出的方法

1️⃣采用一位符号位,根据逻辑运算式

TOyoB4.png

2️⃣

TO6kCt.png

3️⃣采用双符号位

实际存储数据时,只会保存一位符号位,在进行运算时才会复制一个相同的符号位

TO6XIs.png

符号扩展

TOgW9I.png
定点数的乘除运算

乘法运算由累加和右移操作实现,可分为原码一位乘法 和 补码一位乘法

image-20220723174551648

1️⃣原码一位乘法

特点:符号位和数值位分开求,乘积的符号位由两个数的符号位进行“异或”操作得到

7tKcW9.png

根据乘数当前位,是0还是1,若是1,就会加上被乘数然后进行一次逻辑右移

2️⃣补码一位乘法

是一种有符号数的乘法,采用相加和相减操作计算补码数据的乘积

7t1f9e.png

MQ(乘商寄存器)中保存乘数(用补码表示的单符号位,最后一位是辅助位)和乘积的低位部分

X(通用的操作数寄存器)中保存被乘数(用补码表示的双符号位)

ACC(累加器)保存乘积的高位部分(初始为全0,也是采用双符号位)

进行算术右移,若为正数,右移后补0,若为负数,右移后补1

7tfDv4.png

最后多进行了一次加法(加完后不需移位),即若有n个数值位,就进行n+1次加法,n次算术右移

除法运算

原码除法运算,2种

7Nu0YQ.png 7Nayee.png

补码除法运算

7NamIs.png

整数的类型转换

C语言中,有符号整数都是采用补码进行存储的

7N0wzq.png

无符号数和符号数之间的转换,只是改变解释方式

其中长整型向短整型转换时,如int 改为 short存储时,是直接对二进制位进行截断,然后解释后面的位数(4字节转为2字节,重新解释后面16位二进制位为short类型存储的数)

短整型向长整型转换时,进行符号扩展(是有符号数),当为无符号数就直接补0即可

char类型为8位的无符号整数,在强制转为int类型时直接在高位补0即可


数据的存储和排列

在存储数据时,数据从低位到高位可以按从左到右排列,也可以按从右到左排列

一个整型int数据 为01234567H 其中01H为最高有效字节(MSB),67H为最低有效字节(LSB)

大端方式:从左到右,按最高有效字节到最低有效字节的方式存储,即MSB存储在低地址

小端方式:从左到右,按最低有效字节到最高有效字节的方式存储,即LSB存储在低地址

💽数据按边界方式存储

7NDXsP.png

内存对齐存储

边界对齐方式相对于不对齐方式是一种以空间换时间的思想

RISC通常采用边界对齐方式,为了更加方便的实现流水线(取指令)


浮点数的表示和运算

浮点数表示法是指以适当的形式将比例因子表示在数据中,让小数点的位置根据需要而浮动。

这样在位数有限的情况下,既扩大了数的表示范围,又保持了数的有效精度

1️⃣第一种浮点数表示

image-20220723202316646

32位 浮点数由 数符(1位),阶码(8位 移码表示)和 尾数(23位,一般用定点原码表示)组成

阶码的位数反映浮点数的表示范围,尾数的位数反映浮点数的精度

用原码表示尾数时,浮点数的表示范围也是关于原点对称的

  • 运算结果大于最大正数时称为正上溢,小于绝对值最大负数时称为负上溢,正上溢和负上溢统称上溢。
  • 数据一旦产生上溢,计算机必须中断运算操作,进行溢出处理。
  • 当运算结果在0至最小正数之间时称为正下溢,在0至绝对值最小负数之间时称为负下溢,正下溢和负下溢统称下溢。
  • 数据下溢时,浮点数值趋于零,计算机仅将其当作机器零处理。

在这里插入图片描述

浮点数的规格化

因为尾数的位数决定了浮点数的有效数位,有效数位越多,数据的精度就越高。

为了使有效数位(二进制中1为有效数位)尽量占满尾数数位,会对浮点数进行规格化,通过对尾数的移位和改变阶码,

使非零的浮点数在尾数的最高数位上保证是一个有效值(二进制中即是1)

浮点数表示格式和规格化的

2️⃣第二种浮点数的表示

7NcYjA.png

尾数的规格化

7NWHJK.png

IEEE754标准

IEE754标准规定常用的浮点数格式有短浮点数(单精度,float型)、长浮点数(双精度、double型)和临时浮点数

在这里插入图片描述

在这里插入图片描述

在IEE754标准下,32位浮点数中的阶码的移码的偏置值为127( 2^(8-1)-1 )。

7UK0df.png

其中移码为真值+偏置值。如3+127=130。在32位浮点数中阶码为8位。

用无符号数解释时,阶码表示范围为0-255,其中0代表真值是-127,255代表-128都用作特殊情况,正常都是用移码1到254,即真值为-126到127的阶码。

阶码(全1,全0)的特殊用途

7UcjFf.png


浮点数的加减运算

浮点数运算的特点是阶码运算和尾数运算分开进行

分为以下几步

1️⃣对阶

对阶的目的是使两个操作数的小数点位置对齐,即使得两个数的阶码相等

先求阶差,然后以小阶向大阶看齐,将阶码小的尾数右移一位(基数为2),阶码加一,直到两个数的阶码相等

在尾数右移时,舍弃掉有效位会产生误差,影响精度

2️⃣尾数求和

将对阶后的尾数按定点数加(减)运算规则运算,得到的尾数可能不是规格化的,所以下一步要进行规格化

3️⃣规格化

如IEE754标准要保证尾数为1.xxxx,然后存储时只需存储小数点后面的位数位(小数点之前的1是隐藏默认的)

4️⃣舍入

在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将低位移出的两位保留下来,参加中间过程的运算,最后将运算结果进行舍入,还原成IEE754的格式。

0舍1入法:类似于十进制的“四舍五入”法,运算结果保留位的最高数位为0,则舍去;最高数位为1,则在尾数的末尾加1,这样作可能导致尾数溢出,又要进行一次右规

恒置1法:只要因移位而丢失的位中有1,就把尾数末位置1,而不管原来是0还是1

截断法:直接截取所需位数,丢弃后面的所有位,这种方式最简单。

5️⃣溢出判断

在尾数规格化和尾数舍入时,可能会对阶码执行加/减运算。因此,必须考虑指数溢出的问题

若一个正指数即阶码的表示超出了范围(127或1023)则发生了指数上溢

若一个负指数超过了最小允许值,则发生指数下溢,通常把结果当成机器零来处理

对于IEEE754 标准下的32位浮点数,当阶码位全1(11111111)时,代表发生了指数上溢

当阶码为全0(00000000)时,代表指数下溢出,看成机器零进行处理

7U7cOf.png

对于浮点数的溢出,并不是以尾数溢出来判断,尾数溢出可以通过右规得到纠正

浮点数的运算结果是否溢出主要看结果的指数是否发生了上溢,由指数上溢来判断

强制类型转换

7UHfu6.png

posted @   林之在  阅读(421)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示