1. 原码和补码除法中的加减交替法的区别

2. 强制类型转换
2.1 定点数的强制类型转换

2.2 浮点数的强制类型转换
xx位机器:CPU当中的寄存器一次能够处理的数据的比特位位数
3. 边界对齐?

4. 浮点数的表示

?
5. 浮点数的规格化

?5.1 浮点数的左规和右规

?5.2 浮点数的溢出

?6. IEEE 754标准
Institute of Electrical and Electronics Engineers

?
?
7. 浮点数的表示和运算
7.1 浮点数的加减运算

7.2 浮点数的加减运算舍入?

8. 算数逻辑单元?

?8.1?逻辑符号

?
8.1.1 门的电路实现

8.2 加法设计器
8.2.1 一位全加器?

8.2.2 串行加法器

8.2.3 并行加法器
本质上和穿行加法器没啥区别,因为一直要等上一位的进位信息

?并行加法器的优化
通过增加额外的线路连接提高速度

?在CLA加法器的基础上继续拓展成CLA电路
?
ALU芯片的组织
?组内并行,组间串行或者并行

?
9. 存储系统
9.1 主存储器
9.1.1 存储体

9.1.2 存储器芯片的结构
读写控制线可以是一根,也可以是两根
地址线和数据线与存储芯片的容量等价
片选线有两种模式,根据送来的0/1信号确定是否工作

?
9.2 寻址
按不同大小的单元来切分存储器的存储体

?
10.??数组模拟环形队列

10.1 代码实现
package com.yan.DataStructures.Queue;
import java.util.Scanner;
public class CycleArrayQueueDemo {
public static void main(String[] args) {
// 测试
System.out.println("数组模拟环形队列");
// 为了和单项数组模拟的队列作对比,这里是4来存放3个数据,因为空了一个位置
CycleArray queue = new CycleArray(4);
// 接收用户输入
char key = ' ';
// 创建Scanner对象
Scanner scanner = new Scanner(System.in);
boolean loop = true;
// 输出一个菜单
while(loop)
{
System.out.println("s(show):显示队列");
System.out.println("e(exit):退出程序");
System.out.println("a(add):添加数据到队列");
System.out.println("g(get):从队列取出数据");
System.out.println("h(head):查看队列头的数据");
// 接收用户输入的字符
key = scanner.next().charAt(0);
switch (key)
{
case 's':
queue.showQueue();
break;
case 'a':
System.out.println("请输入想添加的数");
int value = scanner.nextInt();
queue.addQueue(value);
break;
case 'g':
try {
int res = queue.getQueue();
System.out.printf("取出的数据是%d\n", res);
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
break;
case 'h':
int res = queue.headQueue();
System.out.printf("队列的头数据是%d\n", res);
break;
case 'e':
// 关闭scanner
scanner.close();
loop = false;
break;
default:
break;
}
}
System.out.println("程序已退出!");
}
}
class CycleArray
{
// 数组最大容量、队列头、队列尾,用于存放数据的数组
private int maxSize;
// 队列头指向第一个元素位置
private int front;
// 队列尾指向最后一个元素之后的元素位置
private int rear;
private int[] arr;
// 创建队列的构造器
public CycleArray(int arrMaxSize)
{
this.maxSize = arrMaxSize;
arr = new int[this.maxSize];
}
// 判断队列是否满
public boolean isFull()
{
return (rear+1) % maxSize == front;
}
// 判断队列是否为空
public boolean isEmpty()
{
return rear == front;
}
// 1.添加数据到队列
public void addQueue(int k)
{
// 先判断队列是否满
if(isFull())
{
System.out.println("队列已满!");
return;
}
arr[rear] = k;
// 此处后移rear的时候考虑取模
rear = (rear+1) % maxSize;
}
// 2.数据出队
public int getQueue()
{
if(isEmpty())
{
// 通过抛出异常来处理
throw new RuntimeException("队列为空,不能取数据!");
}
int tmp = arr[front];
front = (front+1) % maxSize;
return tmp;
}
// 3.显示队列的所有数据
public void showQueue()
{
if(isEmpty())
{
System.out.println("队列为空,没有数据!");
return;
}
// 这里需要重点理解,这个for循环的开始到终止条件怎么写,以及打印的时候为什么还要对i取模
for (int i = front; i < front+((rear+arr.length-front) % maxSize); i++) {
System.out.printf("arr[%d]=%d\n", i%maxSize, arr[i%maxSize]);
}
}
// 4.显示队列的头数据(不是取数据)
public int headQueue()
{
if(isEmpty())
{
System.out.println("队列为空,没有头数据!");
return 0;
}
return arr[front];
}
}
总结
?
1. 谈谈在数据存储中边界对齐和非边界对齐的区别?
? 如果使用边界对齐的方法,就是用内存换时间,如果使用非边界对齐的方法,就是用时间换内存,例如要读一个半字的short变量,如果是边界对齐则只需要读一次地址(计算机每次访存只能读写1个字!),如果采用非边界对齐的话有可能访存两次,虽然降低了内存空间的占用,但是增大了时间成本
2.?单精度浮点数和双精度浮点数的最大和最小值分别是多少?


?
3.?谈谈机械码和真值的区别?
? 机械码没有正负号,而真值有,计算机硬件层面使用的是机械码,而人更理解的是真值
4.?int和float都是4字节,它们之间相互进行强制转换会有什么结果?
? 从表示范围上来说,float的表示范围大于int,但是都是4字节32位,能表示的总个数都是2^32个,因此int强转成float的时候,虽然不会产生溢出(因为int的表示范围小于float),但是可能会损失精度。float强转成int的时候,既可能发生溢出,也有可能损失精度
5. 谈谈如何使用基础电路实现异或门?

?
6.?如何优化加法计算器的速度?
通过不断添加电路线,组成新的模块,使得既能在组内并行,又能组间并行运算
7. 实现数组模拟环形队列的注意点
注意要预留一个空位,这样做的目的是方便判断这个数组模拟循环队列时候的空和满。
在打印队列元素的时候,注意怎么写
for(int i=front; i<(front+(rear+arr.length-front)%maxSize); i++)
|