发布时间:2025-12-09 16:03:08 浏览次数:3
数据是 各种各样的信息,如数字、文本、计算机程序、音乐、图像、符号、运动图像、DNA密码,等等。
实际上,信息可以是能够被计算机存储和处理的任何事物。
计算机内存储和处理信息的最小单位是位(bit,或比特)。一个比特的值可以是0或1,
它是 不可分的。
数字计算机将信息以 一组或一串比特 (称作 字)的形式保存在存储器中。
例如,串01011110表示一个8位的字。
计算机通过高低电压两个等级来存储0和1的状态
目前人们还不能制造出价格便宜的、能够可靠地区分出十个不同电压等级的电路,
只能制造出便宜的、能够区分我们称之为0和1的两个电压等级的电路。
计算机通常不会每次只对一个二进制位进行操作,它们会对一组二进制位进行操作。
一般来讲,计算机能够 同时处理的位数越多,速度就会越快。
随着计算机的速度越来越快,价格越来越低,一台计算机一次能处理的位的组数也越来越多。
Figure :
上图描述了如何用1位、2位、3位和4位得到一个二进制的值序列。
一个n位的字将得到$2^n$条不同的路径或位模式。
一个n位的字将得到$2^n$不同的位模式。
一个n位的二进制字什么也表示不了; 二进制1和0组成的串 没有任何内在含义。
怎样解释一个特定的二进制数只取决于程序员赋予它何种含
按照位置记数法,一个n位的整数N的形式表示:
用小数点将整数部分和小数部分分开,可以对位置记数法进行扩展,使其能表示实数。
一个用基数b的位置记数法表示的数的值被定义为:.
在计算机主要关注下列四种数制
二进制算术运算的规则与十进制基本相同; 唯一的区别在于,十进制算术运算以10为基数,
每位有10个数字,而二进制运算以2为基数,每位只有2个数字。
Figure :
两个位相加可能产生 进位 或 借位
二进制加法示例
二进制减法示例
二进制乘法示例
表示范围、精度、准确性和误差
负数可以用很多种不同的方式表示,但计算机设计者选择了3种方法
每种方法都有其各自的优点和缺点。
一个n位字可以表示从 $0~2^{n-1}$ 共 $2^n$ 个可能的值。
例如,一个8位的字可以表示 $0,1,2,\cdots,254,255$ 共256个数
如果要表示负数,一种方法是用它的 最高位表示符号。
有符号数的值为: $(-1)^S \times M$
Figure :
n位有符号的表示范围为 $-(2^{n-1}-1)$ 至 $+(2^{n-1}-1)$。
确定是0有两种表示方法;例如在8位有符号数中,0的表示:
$00000000=+0$ 以及 $10000000=-0$
补数概念
补数的定义: 是对于给定的进位制,相加后能使自然数a的位数增加1的最小的数
设 n 位 b 进制数 a,规定如下
在N进制下,求数a的补数的计算方式
对于N进制的自然数 $a=a_ra{r-1}a{r-2}\cdots a_1a_0$
规定 数b的各位 $b_i=(N+1)+a_i$为,称数b为 a关于 N+1 的补数
微处理器使用二进制补码系统表示有符号整数,因为它可以将 减法运算 转换为对 减数的补数的加法运算。
例如:用7加上5的补数就可以完成运算7减去5。
一个数与它的补数之和是一个常数
在n位二进制算术中,数P的补数为Q且 $|P| + |Q| =2^n$
补码: 一个n位二进制数N的补码定义为 $2^n - N$;
当8位二进制数 $N=5=00000101$,
补码 $[N]_补=2^8-N=100000000-00000101=11111011$
首先,对于二进制数来说,只要定好了位长,
进行反码(1的补数)和补码(2的补数)
其实是一件很简单的事情。在纯二进制的表示下,
只有0和1,别无他物。0111(4位)的反码就是1000,
补码就是1001(反码加1)。所谓正负、符号这些人赋予的意义都不存在,
只有二进制数和这些简单操作
在计算机中表示负数,如果用最高位表示符号这种“原码”方式,
虽然有利于人的阅读,但 不利于其本身的计算。
所以系统内部就 把负数统一用“其对应正数的补码”来表示,
而正数自己不用改变。这样变换后,正数虽然形式上没有变,
但与原码相比,含义却变了,因为 符号位已经不再是符号位了,
此时的 正数和负数 都在一致的“补码编码空间”中。 。
由于原码空间到补码空间的转化,只需要对负数进行,正数是不用
发生任何变化
正数在计算机“补码编码空间”中的表示和原码一致。
但这绝 不等价于 “对正数进行补码运算,结果是其本身”。
下面来看计算机中补码的运算过程:首先我们将4个数 +5,
-5,+7和 -7 以补码形式表示
下面计算 7 - 5
结果为9位二进制数100000010。如果忽略最左边一位(也叫“进位位”),
结果为00000010 = +2,这正是我们所希望看到的结果。
下面计算5 - 7
结果为11111110(进位位为0)。我们预期的结果为-2;
即$2^8 - 2=10000000-00000010 = 11111110$ 。
再一次得到了所需要的结果。
考虑n位二进制算术运算 $Z=X-Y$,我们用X加上Y的补数来完成这一运算。
Y的补码为 $2^n - Y$,则有 $Z=X+(2^n-Y)=2^n+(X-Y)$。
也就是说,我们得到了所需要的结果,X-Y,
以及位于最左边的一个并不需要的进位(即 $2^n$),而这个 进位被丢弃了。
一个数连续两次求补码得到本身
补码的特点
运算溢出: 5位有符号二进制补码数的表示范围为 -16~+15
如果两个正数相加且结果大于15,会超出5位二进制补码的表示范围
如果两个负数相加且结果小于-16,也会超出5位二进制补码的表示范围
先介绍 二进制补码数的算术移位运算
人们手动计算乘法过程
数字计算机并没有实现上面的算法,因为这种算法要求计算机存储n个部分积,
然后将它们同时相加。
一种更好的技术是每得到一个部分积时就做一次加法。
一个计算两个n位无符号二进制数相乘的算法。
算法示例
通过 移位和加法 实现的乘法速度很慢。实际的计算机采用了多种方法加快乘法运算的速度。
例如,构造专门的 逻辑阵列直接得到两个数的积 而不必对操作数移位。
与负数相乘
Figure :
二进制除法和十进制出发计算类似
计算机实现的除法算法--恢复余数除法
唯一需要修改的就是除数与部分被除数的比较方法。
人们用心算进行比较,而计算机必须做减法并检测结果的符号位。
如果减法的 结果为正,则商1,
但若 结果为负,则应商О 并将 部分被除数与除数相加,
将其 恢复为原先的值
Figure :
恢复余数除法示例
Figure :
计算机实现的除法算法--不恢复余数除法
部分被除数减去除数之后,将检测新的部分被除数的符号位。
Figure :
不恢复余数除法示例
浮点数即为实数,称为浮点数的原因是小数点在数中 位置不固定。
浮点数存储分成 两部分:数值和小数点在数值中的位置
使用科学计数法来表示浮点数,科学计数法的好处是可以表示很大或者很小的数。
其中 尾数表示值; 指数表示小数点在数值中的位置
计算机中浮点数运算结果 一般是不确定的。不同芯片对浮点数的出来可能是不同的。
由于浮点数被定义为两个值的积,浮点数的表示并不唯一,需要对其进行规格化。
规格化
为了使表示法的固定部分统一,科学计数法(用于十进制)和浮点表示法(用于二进制)
都在 小数点左边使用了唯一的非零数码,这称为 规范化 。
十进制系统中的数码可能是1~9,而二进制只能是1.
偏置指数(余码系统):指数使用n位表示;给指数加上一个常熟,使得最小负指数为0
下图给出了 4位指数 的偏置指数对应关系。
IEEE 754浮点数标准提供了3种浮点数表示
一个32位IEEE 754单精度浮点数可以被表示为下面的二进制位串:
S EEEEEEEE 1.MMMMMMMMMMMMMMMMMMMMMMM
32位IEEE754浮点数结构
IEEE754浮点数格式
Figure :
十进制转为二进制浮点数示例
二进制浮点数转为十进制数
接近0的浮点数: 指数为2位;;尾数为2位的浮点数系统
Figure :
浮点数0附近有一块 禁止区,其中的浮点数都是 非规格化的,
因此无法被表示为IEEE标准格式。这个数的指数和起始位都是0的区域,也可用来表示浮点数。
不过,这些数都是非规格化的,其 精度比规格化数的精度低,会导致 渐进式下溢。
IEEE标准的其他特点
IEEE标准定义的异常有:
浮点数时不能直接进行加法运算。
浮点数加法的计算步骤: 先对阶数,尾数相加,结果规格化。
第1步,找出指数较小的那个数。
第2步,使两个数的指数相同。对于指数小的那个数,指数加几,就将尾数右移几位。
第3步,尾数相加(或相减)。
第4步,如果有必要,将结果规格化(后规格化)。
Figure :
因为浮点运算可能引起尾数位数的增加,因此需要能够保持尾数位数不变的方法。
最简单的技术叫作截断(truncation)。
截断会产生 诱导误差(induced error)(即误差是由施加在数上的操作计算所引起的),
诱导误差是偏置的,因为 截断后的数总是比截断前的小。
舍入(rounding)是一种更好的减少数的位数的技术。
如果丢弃的位的值 大于 剩余数 最低位 的一半,则将剩余数的最低位加1。
舍入机制
当要舍入的数位于两个连续浮点数的正中时,IEEE舍入机制会选择最低位为0的点(即向偶数舍入)。
整数操作时精确、可重复的,浮点数操作是不精确的。
考虑表达式 $z = x^2-y^2$,x、y、z都是实数。
可以将表达式视作 $x^2-y^2$ 或 $(x+y)(x-y)$ 计算,整数运算得到相同结果,
但浮点数运算可能得到不同结果。
IEEE要求加、减、乘和除运算结果能够 精确计算,并用向偶数舍入的方法将结果舍入为最近的浮点数。
舍入造成的生成误差(generated error)或通过计算链传播的传播误差(propagated error)
都会被引人浮点运算。
考虑使用泰勒公式来求一些高级函数在某点的值。