进制知识及整型、浮点型的存储

目录

一、2,8,16进制正整数的概念及互化

(1)源因 

(2)m进制正整数的表示方法

(3)十进制正整数化为其它m进制数

(4)二进制与八、十六进制正整数互化

二、m进制小数 

(1)概念及计算

 (2)把十进制小数化为m进制整数

(3)小数存储的表示误差

三、进制知识:整数的补码表示法

(1)整数的存储格式

(2)多字节整数在字节存储器中的存储顺序

(3)有符号整数与无符号整数

四、IEEE单精度浮点数格式

1.基本概念:

2.IEEE单精度浮点数格式的表示方法

3.浮点格式的表示能力

小结


一、2,8,16进制正整数的概念及互化

(1)源因 

由于数字计算机是由逻辑电路组成,而逻辑电路最基础的状态就是两个——开和关运算简单,硬件易于实现,成本低,计算机硬件采用二进制。

但是一旦数值稍大,二进制的位数就会很多,人工记录很麻烦。为了简化二进制的表示,就需要引入更高进制。由于八进制和十六进制很容易与二进制数互相转化,因此在计算机科学中这两种进制是最常用的两种,尤其是十六进制,因为一个字节有8bits,正好可以表示为两位十六进制数,所以是最为常用的。

(2)m进制正整数的表示方法

1.

  • 每一位数的取值范围为[0,m-1]。注:大于10的数用abc等字母表示。
  • 最高位在最左侧,最低位在最右侧。
  • 从0次方开始。

设m进制数x为N5N4N3N2N1,则该数对应是十进制数为:N5*m^4+N4*m^3+N3*m^2+N2*m+N1.

 2.在计算机科学中,根据英文缩写,常采用后缀字母D(DEC)来表示十进制,B(BIN)来表示二进制,H(HEX)表示十六进制,O(OCT)表示八进制。

3.二进制数的一些术语:

bit: 每个二进制位;Byte:8个连续记录(书写)或者存储的二进制位;定长二进制数:用固定长度表示的二进制数。

当二进制数的实际位数低于该固定长度时,高位用0占位。

  例如:十进制数12在8位和16位ALU(算术逻辑单元)中分别表示为:  (0000 1100)2    和             (0000 0000 0000 1100)2 

当两个n位(n>1)定长二进制数进行运算,运算结果实际位数如果大于n,造成数据溢出。

(3)十进制正整数化为其它m进制数

算法:m连除取余

  1. 将待转化的数记作a;
  2. 执行a / m,商作为新的a,并记录余数;
  3. 若a > 0,重复步骤2;若a = 0,结束运算;
  4. 将得到的各个余数按时间顺序从近到远,就得到结果。 

例如:将139分别转化为二进制数、八进制数和十六进制数。

 结果分别为(10001011)2、(213)8和(8B)16。 

(4)二进制与八、十六进制正整数互化

  • 8 = 2^3所以每三个二进制位对应一个八进制位,同理,每四个二进制位对应一个十六进制位。将二进制数转为位八进制数时,从最低位开始,每三位数为一组,将其转化为八进制数。若最高位不足三位,可以在最左端补零。同理,将二进制数转化为十六进制数时,从最低位开始,每四位一组转为十六进制数即可。

       例如:将139的二进制数转化为八进制和十六进制

  •  把八进制和十六进制转化为二进制则是上述过程的逆运算,每一个八进制(十六进制)位对应3(4)个二进制位。

二、m进制小数 

(1)概念及计算

 带小数的m进制正数可记为: dn1dn2 … d1d0 . b1b2b3 … 其中di,bj∈[0,m-1],i = 0, 1, … , n1,  j = 1, 2, 3, …。dn1 dn2 … d2 d1 d0是该数的整数部分,而b1 b2 b3 …则是该数的小数部分。     这样的m进制小数对应的十进制真值为:

 (2)把十进制小数化为m进制整数

算法: 先用“m连除取余”把整数部分化成m进制整数,然后用“m连乘取进位”把小数部分化成m进制小数。m连乘取进位具体步骤如下:

  1. 将该数的整数部分记作0,小数部分记作a;
  2. 计算a*m,记录所得数的整数部分(称为进位)然后将其清零,小数部分记作新的a;
  3. 若a=0或者精度达到要求,停止计算,按所得的顺序写下进位,则得到小数部分的m进制数,否则重复第二步。

例如:将十进制数6.3转化为二进制小数形式:

 6的二进制数为110。故6.3的二进制数为(110.010011001...)2。

(3)小数存储的表示误差

由以上的计算过程其实已经可以得出小数在计算机的存储中必然存在误差,因为计算机存储器或者ALU中的二进制数一定是固定的有限长度,不可能有无限个比特位。对于二进制位小数较多或者甚至有无限个小数的情况,我们只能取达到一定精度的位数。于是就产生了表示误差,并且这是系统误差,无法避免。例如刚才计算的6.3,若只取小数点后八位,则6.3=(110.01001100)2。其表示的真值为6.296875,存在误差。

三、进制知识:整数的补码表示法

(1)整数的存储格式

整数的存储长度在程序设计语言以及数据库中存储的整数一般以字节为单位,常用的有8位(1 byte)、16位(2 bytes)、32位(4 bytes), 64位(8  bytes)。

如C语言中,字符型(char),整型(int)和双精度浮点型(double)分别为1,4,8字节。

(2)多字节整数在字节存储器中的存储顺序

存在两种形式:

  1. 高位在前:按照内存地址增大的顺序,先存低位,再存高位。即将数据的低位存在了地址的低位(倒着存),为小端存储模式。
  2. 低位在前:按照内存地址减小的顺序,先存高位,再存低位。即将数据的高位存在了地址的高位(正着存),为大端存储模式。

在IBM-PC系列微机中,大多数程序语言软件以及数据库软件采用的方式为低位在前,高位在后,因为Intel CPU的指令系统采用低位在前,高位在后(小端存储)的方式存取整数。 

 举例如下(小端存储):

假设存储器每个存储单元只能存储8bit,则

十进制数20221117(1348CBDH)用VS2019的int类型表示,则该整数在内存中占用五个存储器单元(每个单元一个字节)。其内存如下:

                                                                                 低地址<----->高地址

 由此可见,我们写出来的和存储地址是相反的,存储顺序为BD 8C 34 01,即小端存储。

(3)有符号整数与无符号整数

1.无符号整数:无符号整数不含正负号,不能表示负数。

存储格式:就是定长正整数或者0。在内存中,无符号整数表示的实际整数值等于机器数。

2.有符号整数:存储的整数含符号信息,可以表示正数、负数和零。

存储格式:存在以下三种形式

  1. 原码:最高位为符号位(1负0正)剩下位数的值作为其绝对值。
  2. 反码:正数的反码与原码相同,负数的反码是对该数原码除符号位外各位取反。
  3. 补码:正数的补码与原码相同,负数的补码是对该数的补码加一。补码是有符号整数的实际    存储形式。

注:在Java不支持无符号整数,C/C++中整数分为有符号和无符号两种。

有符号整数与无符号整数仅仅是程序的处理方式不同。8 位无符号整数 255 与 8位有符号整数-1(补码)的存储单元内容完全一样,即存储单元的内容都是FFH(255)。这时,如果支持软件把它当作无符号数,它对应的十进制数为255;反之,如果支持软件把它当作有符号数处理,即补码处理,则根据补码表示法,它对应的十进制数为-1。

3.①负数补码的求法

求补运算:1.对原码除符号位以外,所有位上的数按位取反;2.对步骤1得到的数加1。

十进制运算:求2^n+x(x为所求负数,n是n位寄存器)的二进制数。

例如:求-104的补码:

 ②已知负数补码求真值:

求补运算:对补码除符号位外,所有位按位取反,在对该数加1,得到原码,再将原码转化为十进制真值

十进制运算:将补码化为作无符号整数(即2^n+x),然后再减去2^n即可。

例如:已知1001 1000,求其真值。

 4.符号拓展

当用更多的内存存储有符号整数时,将补码符号位上的数复制到高位。符号拓展后数的值并不发生改变。如1001 1000拓展后得到1111 1111 1001 1000。

5.n位补码表示的真值范围

有符号:0~2^n - 1

无符号:-2^(n-1)~2^(n-1)-1

四、IEEE单精度浮点数格式

1.基本概念:

实数的存储通常采用浮点格式,程序设计语言都采用IEEE(Institute of Electrical and Electronics Engineers)浮点格式。该浮点格式有单、双两种精度。

IEEE单精度浮点格式:采用32bits(4字节)机器数来表示。32bits中包括1个符号位,8位阶码(binary exponential)和23位尾数(mantissa)。

IEEE双精度浮点格式:采用64位机器数:1位符号位,11位阶码(基为1023)和52位尾数,存储格式与字节顺序同单精度浮点数。

2.IEEE单精度浮点数格式的表示方法

以下是较正式的定义:

①符号位:1表示真值为负数,0表示真值为正数。

②阶码:阶码减去127(127称为幂次的基)得该二进制数以2为底的幂次。

③尾数:二进制有效数字。一般规格化为整数部分为1(即二进制的第一位有效数字),而尾数只记录小数部分。

对于规格化的尾数,它的最高位隐含着一个整数部分的1,因此规格化尾数表示的十进制数范围应该是区间 [ 1.0 , 2.0 )。

 简单来说,此处可以和十进制中的科学计数法来类比。例如14725.8369用科学计数法来表示应为1.47258369*10^(-4),其中 阶码-127 相当于 10进制科学计数法中10的指数。1.47258369则相当于1.二十三位尾数部分。感觉这就是计算机科学里的科学计数法。

例如:①已知单精度浮点数的机器数为BED00000H,求它表示的十进制数真值。

②把十进制数-180.3化为IEEE单精度规格化浮点数

 由此可见,IEEE单精度浮点数格式有三大要素:符号、阶码和尾数。

3.浮点格式的表示能力

①十进制有效数字位数:由尾数位数决定。对于规格化浮点数,其二进制有效数字位数为24位(单精度)和53位(双精度)。

 ②十进制数量级范围:

小结:

至此第一篇实验报告的内容总结基本结束,省略了补码的加减法,因为感觉单独在这篇讨论补码加减法的运算内容会不完整,更何况那简单得没必要单独写出来。其实既然已经写了进制知识,就应该把进制的知识都尽量写出来,不过学校给的自学资料并没有对乘除做要求,我只是大概知道和位运算有关系。也许后面会补上吧。现在是肝不动了:)

参考资料:学校发的学习资料。例子基本属于临时举例自行计算,图片随手画的。

                                                                                                                                  ——2022.11.18

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值