计算机定点运算详解

说是详解,估计也真详解不了。很多东西太多了,我就挑一些重要的,现在依然有使用的,就像我的老师说的,那些过时的东西了解即可,无需弄懂。
感觉很好的一个PDF,一直在找是哪本书,感觉上面的内容真的很好。

本文讲什么?

在计算机中,小数点并没有用专门的器件去表示,而是按照一种约定的方式,统一存储在寄存器单元中的。算数逻辑运算单元(ALU)是CPU的组成部分,负责算数和逻辑的运算。那么,ALU究竟是如何工作的呢?
这就是本文主要探讨的内容:

  • 什么是定点数?
  • 定点数的位移、加、减、乘、除运算是如何进行的?
定点数是啥?

从字面意思来理解,“定点数”就是“点”不动的数。那么究竟是什么“点”不动呢?没错,就是“小数点”。

在上一讲我们说道,不论是整数还是小数,都是有小数点的。整数的小数点表示在最后一位数字的后面,而小数的小数点标识在真值的符号位后面。如图所示:

定点运算器特殊寄存器_定点数


缺陷:对于定点数而言,由于其小数点位置不变,因此当处理非纯小数的时候,我们时刻需要乘上一个比例因子,以防止溢出。那么要是小数点可以移动那就好办了,这种数我们称为浮点数。

定点运算器特殊寄存器_带符号_02


基本上在围绕着这玩意在讲,因此这个原理你要是弄清楚了,基本上定点运算也就清楚了。

定点数加减运算

补码加法:

负数用补码表示后,可以和正数一样去处理

当需要减去一个数x的时候,可以用加上x对应的负数的补码【-x】补来代替

【x】补+【y】补=【x+y】补

补码减法

【x-y】补=【x】补+【-y】补(mod 2)

【x-y】补=【x】补+【-y】补 (mod 2的n+1次方)

补码基本规则:

  • 运算的各个操作数均用补码表示,运算结果仍是补码
  • 符号位和数值位一样参加运算
  • 如果求和,则将两补码直接相加,得到两数之和的补码,若求差,则将减数变补(【y】补变【-y】补),然后和被减数相加,得到两数之差的补码
  • 如果超过则模丢掉
溢出:

请看溢出检测处理

定点乘法:

原码一位乘法:数值位相乘 符号位单独处理

乘积的位数扩大一倍(两个4位相乘变成8位)

改进乘法:

定点运算器特殊寄存器_补码_03

定点除法

原码除法运算原理

两个原码表示的数相除,商的符号由两数的符号按位相加求得,商的部分由两数的数值部分相除求得。

被除数x原码为【x】原=XfXn-1.....X1X0

除数y原码【y】原=YfYn-1....y1y0

则有商q=x/y其原码为

【q】原=(Xf异或Yf)+(0.Xn-1...X1X0/0.Yn-1...Y1Y0)

定点运算器特殊寄存器_定点运算器特殊寄存器_04

恢复余数法:

机器必须现做减法,若余数为正才知道够减,若余数为负,才知道不够减。不够减是必须回复原来的余数,以便在继续往下,这种称为恢复余数法。

不恢复余数法:

但由于要恢复余数,使除法进行过程的步数不固定,因此控制比较复杂

实际中常用不恢复余数法,又称加减交替法,重点是运算过程中如出现不够减则不必恢复余数,根据余数符号,可以继续往下运算,因此步数固定,控制简单。

定点运算器特殊寄存器_带符号_05

定点运算器特殊寄存器_补码_06


真题

1、假定在一个8位字长的计算机中进行如下类C程序

1 unsigned  int x=134;
2 unsigned int y=246;
3 int m=x;int n=y;
4 unsigned int z1=x-y;
5 unsigned int z2=x+y;
6 int k1=m-n;
7 int k2=m+n

若编译的时候将8个8位寄存器R1~R8分别分配给x y m n z1 z2 k1 k2请回答下列问题(带符号整数用补码表示)

1)执行上述程序段后,寄存器R1 R5 R6和分别是什么,十六进制表示

2)执行后,变量m和k1的值分别是多少(十进制)

3)上述程序段设计带符号的整数加减 ,无符号整数的加减运算 四种运算能否利用同一个加法器及辅助电路实现?

4)计算机内部如果判断带符号的整数加减运算的结果是否溢出,上述程序段中,那些带符号整数运算语句的执行结果会溢出

定点运算器特殊寄存器_定点数_07


答:1)x=134=1000 0110=86H Y=246=1111 0110=F6H

R5=x-y=134-246=-112->1111 0000->1 001 0000(补)=90H

R6:z2=134+246=380=1 0111 1100=7CH(高位丢弃了)

2)m补=x=1000 0110->m=1111 1010 =-122

n补=y=1111 0110->n=1000 1010 =-10

k1=m-n=-122-(-10)=-112

3)能 无符号数有符号数都是二进制代码,有符号数的符号位代码化了,和数值位一样参加运算,减一个数等于加上整数对应的负数的补码

4)双符号位 单符号位等

2、

定点运算器特殊寄存器_带符号_08

逻辑移位与算术移位的区别
  • 1)算术移位 当乘数或除数是2n时,算术移位用来快速地完成对整数进行乘法或除法的运算。算数左移n位相当于乘上2n,执行方法是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补0。
  • 2)逻辑移位 逻辑左移n位的执行方法,是把原来的数中每一位都向左移动n个位置,左面移出的高位丢弃不要,右面低位空出的位置上全部补"0"。 逻辑右移n位的执行方法是把原来数中的每一位都向右移动n个位置,右面移出的低位丢弃不要,左面高位空出的位置上全部补0。

逻辑左移和算术左移无区别 统一功能的两种写法(相当于无符号数乘2)右移 有区别 算术右移 最高位无变化 (相当于 有符号数除2)逻辑右移最高位 不管是什么都用0填充 (相当于 无符号数除2)

PDF:http://www.tup.com.cn/upload/books/yz/053727-01.pdf