2022.11.25
运算方法和运算电路基本运算部件一位全加器串行进位加法器并行进位加法器带标志加法器定点数的移位运算算术移位逻辑移位循环移位定点数的加减运算定点数的乘除运算原码一位乘法补码一位乘法(Booth算法)原码除法(恢复余数法)原码除法(加减交替法)补码除法(加减交替法)C语言整数类型与类型转换有符号数与无符号数不同字长的整数转换数据的存储与排列大端字节序与小端字节序“边界对齐”
Overview:
注意本节不是重点!
- 一位全加器:通过两个加数和上一位进位位,计算出本次的结果和进位位
- 串行全加器:一个结果计算出来下一位再计算,速度慢
- 并行全加器:利用公式把串行全加器结果算出来,这样一下就计算出来了
- 带标志加法器:
和表达式:
进位表达式:
我的理解:
- 和表达式:两个加数和上一位进位位,依次相加,这里的相加用的是异或
- 进位表达式:两种情况,AB都是1,或,AB有一个是1一个是0同时上一位有进位
例题:加法器中每位的进位生成信号g为:
进位信号g:
进位传递信号p:
缺点:时间慢
溢出OF(有符号数看OF):
符号SF:
零标志ZF=1:当所有F=0
进位/借位CF(无符号数看CF):
强烈推荐课程:
正数全加零,负数原码全加零,负数反码全加一,负数补码左移加0,右移加1
码制 | 填补代码 | |
---|---|---|
正数 | 原码、补码、反码 | 0 |
负数 | 原码 | 0 |
负数 | 补码 | 左移添0 |
负数 | 补码 | 右移添1 |
负数 | 反码 | 1 |
溢出部分丢弃,左右都补零
一个8位寄存器内的数值为 11001010,进位标志寄存器C为0,若将此 8位寄存器循环左移(不带进位位)1位则该8位寄存器和标志寄存器内的数值分别为()。
A. 1001 0100,1
B. 1001 0101,0
C. 1001 0101,1
D. 1001 0100,0
【答案】:C
[CF, 11001010]
[CF(1), 10010101],注意,最左边的1也会同时移动到CF里边!
【2018统考真题】整数x的机器数为11011000,分别对x进行逻辑右移1位和算术右移1位操作,得到的机器数各是()。
A.11101100、11101100
B.01101100、11101100
C.11101100、01101100
D.01101100、01101100
【答案】:B
符号位参与运算;最高位进位丢弃
例题:A=15,B=24,求
溢出判断:只有符号相同的数加减才会溢出
(
一位符号位:
我的理解:
就是符号位001或110的时候,V的两项一定是000+111,最后得一。如果符号不同AsBs就会得到零让V得到零
- 无论加减法都会加法器实现的,所以我们把加减法都考虑为加法
- 两个正数相加为负数,或两个负数相加为正数,说明溢出
- 正数与负数相加永远不会溢出
双符号位
例题:计算机字长为8位,CPU有一个8位加法器。无符号数x=69, y=38,如果在该加法器中计算x-y,则加法器的两个输入端信息和输入的地位进位信息分别为( )
不管是补码减法,还是无符号数减法,都是用被减数加上减数的负数的补码来实现的。根据求补码公式,减数y的负数的补码为
当Sub为1时,做减法,当Sub为0时,做加法。69的二进制数为01000101;38的进制数为00100110,各位取反11011001。【这里注意,这道题重点是ALU内部电路实现,所以求
答案:0100 0101、1101 1001、1
例题:某计算机中有一个8位加法器,带符号整数x和y的机器数用补码表示,[x]补=F5H, [y]补=7EH,如果在该加法器中计算x-y,则加法器的低位进位输入信息和运算后的溢出标志OF分别是()。
A.1、1
B.1、0
C.0、1
D.0、0
【答案】:A。加法器的低位进位输入信息就是sub,加法sub为0,减法sub为1.
【2010统考真题】假定有4个整数用8位补码分别表示:
A.
B.
C.
D.
【答案】B
【2018统考真题】减法指令“subR1,R2,R3”的功能为“(R1)-(R2)→R3”,该指令执行后将进行生成进位/借位标志CF和溢出标志OF,若(R1)=FFFF FFFF H, (R2) = FFFF FFF0 H, 则该减法指令执行后,CF与OF分别为()。
A.CF=0,OF=0
B.CF=1,OF=0
C.CF=0,OF=1
D.CF=1,OF=1
答案:R1<R2 所以借位CF=0,没有溢出OF=0,A
注意定点小数的除法也是用定点数来表示的,表示不了大于1的小数,所以定点小数除法中,被除数一定要小于除数!
算法 | 符号位 | 移动 | 累加 |
---|---|---|---|
原码一位乘法 | 单独运算 | n | n |
补码一位乘法(Booth) | 参与运算 | n | n+1 |
原码除法(恢复余数) | 单独运算 | n | n+k |
原码除法(加减交替) | 单独运算 | n | 最后余数为正: n+1 最后余数为负: n+2 |
补码除法(加减交替) | 参与运算 | n | n+1 |
SUMMARY: 移一次,加一次
符号位:
结果:
推荐网课:
SUMMARY:移一次加一次,最后多加一次
符号参与运算
运算规则
操作 | ||
---|---|---|
0 | 0 | 部分积右移一位 |
0 | 1 | 部分积右移一位,加 |
1 | 0 | 部分积右移一位,加 |
1 | 1 | 部分积右移一位 |
a | b | 部分右移一位,加 |
例题
原理
我的理解:
如果每次加法都是加1移位,比如
,可以把一些连续的1合并起来进而减少加法次数: “丢失位(右)”减去“最后一位(左)”是-1,说明处于连串的1要开始了,先减一个小的。
“丢失位(右)”减去“最后一位(左)”是0,说明处于连串的1或0之间,不做运算。
“丢失位(右)”减去“最后一位(左)”是1,说明处于连串的1结束了,加一个大的。
符号单独运算
例题:
符号位:
结果:
资源推荐:
符号单独运算
加减次数:最后余数为正 n+1次,最后余数为负n+2次
左移次数:n次,最后一轮不需要移动
例题:
符号位:
结果:
我的理解:
- 恢复余数如何变成加减交替:之前的不恢复余数法太慢了,如果商1后结果是负数,原来的做法是把除数加回去左移再商1,现在这一步可以被简化成左移再加
- 最后一轮没办法用上述方法了,所以变成了恢复余数法,如果余数为正,商1,如果余数为负,商0,然后恢复余数。
补码一位除法的特点是,符号位与数值位一起参加运算,商符自然形成。除法第一步根据被除数和除数的符号决定是做加法还是减法;上商的原则根据余数和除数的符号位共同决定,同号上商“1”,异号上商“0”;最后一步商恒置“1”。
加减交替法的规则如下:
①符号位参加运算,除数与被除数均用补码表示,商和余数也用补码表示。
②若被除数与除数同号,则被除数减去除数;若被除数与除数异号,则被除数加上除数。
③若余数与除数同号,则商上1,余数左移一位减去除数:若余数与除数异号,则商上0,余数左移一位加上除数。
④重复执行第③步操作n次。
⑤若对商的精度没有特殊要求,则一般采用“末位恒置1”法。
例题:
补码不恢复余数法,够减商0,不够减商1
一般机器采用补码进行存储,下面是同样的内容通过short和unsigned short解释的结果:
变量 | 真值 | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
short x | -4321 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
usigned short y | 61215 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 |
案例:
int main(){
unsigned short x = 65535;
short y = (short)x;
printf("x=%u, y=%d\n",x,y);
// x=65535, y=-1
return 0;
}
多出的部分截断,少的位数补“零”
案例:
int main(){
int x = 165537, u = -34991; // int 占用4B
short y = (short)x, v = (short)u; // short 占用2B
printf("x=%d, y=%d\n",x,y);
printf("u=%d, v=%d\n",u,v);
// x=165537, y=-31071
// u=-34991, v=30545
return 0;
}
int i = 01234567H;
对齐方式:
char按1B,short按2B,int占4B,douoble占8B
例题:
struct node{
char id[9];
char name[16];
int post;
char phone[20];
}
若变量x的数据类型为strcut node,x的首地址是 0x804 9818,x.phone的起始地址?
18 + 9 = 18 + 8 + 1 = 21
21 + 16 = 21 + 15 + 1 = 31
注意int需要从4B整数倍开始存储,31 -> 34
34 + 4 = 38
答案:0x804 9838
假设32位计算机:
边界对齐:
边界不对齐:
边界对齐方式相对边界不对齐方式是一种空间换时间的思想。精简指令系统计算机通常采用边界对齐方式,因为对齐方式取指令时间相同,因此能适应指令流水线。
【2012统考真题】某计算机存储器按字节编址,采用小端方式存放数据。假定编译器规定int和short型长度分别为32位和16位,并且数据按边界对齐存储。某C语言程序段如下:
strcut{
int a;
char b;
short c;
}record;
record.a = 273;
若record变量的首地址为0xC008,地址0xC008中的内容及record.c的地址分别为( ) A. 0×00, 0xC00D B. 0x00, 0xC00E C. 0x11, 0xC00D D. 0x11. 0xC00E 【答案】:注意,char类型是8bit。答案D
【2009 统考真题】一个C语言程序在一台32 位机器上运行。程序中定义了三个变量x、y、z,其中x和z为int型,y为short 型。当x=127、y=一9时,执行赋值语句z = x + y 后, x、y、z分别为 A. x=0000007FH, y=FFF9H, z=00000076H B. x=0000007FH, y=FFF9H, z=FFFF0076H C. x=0000007FH, y=FFF7H, z=FFFF0076H D. x=0000007FH, y=FFF7H, z=00000076H
【2021统考真题】嘉定编译器规定int和short类型长度分别为32位和16位,执行下列C语言语句:
unsigned short x = 65530;
unsigned int y = x;
得到的机器数是( )
【答案】:B
【2013统考真题】某字长位8位的计算机中,已知整形变量x,y的机器数分别为
【答案】:两个进位位异或为0!无溢出
【2018统考真题】某32位计算机按字节编址,采用小端方式。若语句int=0;
对应指令的机器代码为“C745FC00000000”,则语句int i = -64;
对应指令的机器代码是()。
A.C7 45 FC C0 FF FF FF
B.C7 45 FC 0C FF FF FF
C.C7 45 FC FF FF FF C0
D.C7 45 FC FF FF FF 0C
答案:注意!小端字节序!A
【2011统考真题】假定在一个8位字长的计算机中运行如下C程序段:
unsigned int x = 134;
unsigned int y = 246;
int m = x;
int n = y;
unsigned int z1 = x - y;
unsigned int z2 = x + y;
int k1 = m - n;
int k2 = m + n;
若编译器编译时将8个8位寄存器R1~R8分别分配给变量x、y、m、n、z1、z2、k1和k2,回答下列问题(有符号整数用补码表示):
执行上述程序段后,寄存器R1和R5和R6的内容?(用16进制表示)
执行上述程序段后,变量m和k1的值(用10进制表示)?
上述程序段涉及有符号整数加减、无符号整数加减运算,这四种运算能否利用同一个加法器辅助电路实现?说明理由
能。n位加法器实现的是模
计算机内容内部如何判断有符号整数加减运算的结果是否发生了溢出?上述程序段中,哪些有符号整数运算语句执行结果会发生溢出?
输入的两个数的符号相同,但与输出结果符号不同。最后一条会溢出。