双符号位法:
将符号位扩展为2位,具体说就是对于正数两个符号位是“00〞,对于负数两个符号位是“11〞。
两个符号位都看作数码一样参加运算。
两个数相加后,其结果的符号位出现“01〞或“10〞两种组合时,表示发生溢出。
①符号位“01〞,上溢出
②符号位“10〞,下溢出
③符号位“00〞或者“11〞,未溢出从[y]补求[-y]补的法如此是:
对[y]补“包括符号位求反且最末位加1〞,即可得到[-y]补。
3.2.4定点整数的一位原码乘法运算
进展定点整数原码乘法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进展具体操作。
操作时首先选择“输入〞按扭输入参与运算的数据,然后再选操作按扭。
如图3-7
图3-7定点整数原码乘法
设置输出数组out[]与进位标志数组carry[],carry[]最后一位初值为‘0’,carry[]长度比输入大1位。
对输入的两个字符串仿照并行乘法器的工作原理,将乘法转化为加法。
使用循环语句,按位相乘,再做原码加法。
由于是带一位符号位的原码乘法,要得到运算结果的符号位,就要对in1[0]和in2[0]进展判断:
if((in1[0]=='0'&&in2[0]=='0')||(in1[0]=='1'&&in2[0]=='1'))signal="+";if((in1[0]=='0'&&in2[0]=='1')||(in1[0]=='1'&&in2[0]=='0'))signal="-";返回按钮。
算法的原理:
在定点计算机中,两个原码表示的数相乘的运算规如此是:
乘积的符号位由两数的符号位按异或运算得到,而乘积的数值局部如此是两个正数相乘之积。
设n位被乘数和乘数用定点小数表示(定点整数也同样适用)
被乘数[x]原=xf.xn-1…x1x0
乘数[y]原=yf.yn-1…y1y0
如此乘积[z]原=(xf⊕yf)+(0.xn-1…x1x0)(0.yn-1…y1y0)式中,xf为被乘数符号,yf为乘数符号。
机器算法:
机器中一种方法是屡次采用〞加法-移位“的方法来完成,称为串行乘法器,它的硬件结构简单,但是速度慢,目前广泛使用的是流水式阵列乘法器,称为并行乘法器。
无符号数m乘以n会产生m*n个位积,出现m+n个列和,并行乘法器的关键是快速产生m*n个位积,对位积进展相加运算产生m+n个列和。
第一步:
位积的产生观察乘法运算0*0=0,0*1=0,1*0=0,1*1=1相当于:
a∩b。
所以m*n个位积可以由m*n个与门并行产生。
第二步:
列和的产生:
利用全加器
3.2.5浮点数的加减运算
进展定点整数单符号位补码加减法、定点整数原码乘法、浮点加减法的实现时都是在主窗体选择对应的菜单项后进入对应窗体再进展具体操作。
操作时首先选择“输入〞按扭输入参与运算的数据,然后再选操作按扭。
如图3-8
图3-8浮点加减法运算
数据输入分为阶码和尾数,将两个数的阶码和尾数对应的变形补码表示出来,比拟价码大小并完成对阶即小阶向大阶看齐,假如对阶时发生溢出如此发出提醒,统一阶码后,采用规格化进展尾数求和,对尾数进展舍入处理,判断尾数最末尾情况,用Replace语句实现粗略舍入处理。
最后进展变形补码复原。
算法的原理:
浮点数的加减法运算分为六个步骤:
a〕0操作数检查
浮点加减运算过程比定点运算过程复杂。
如果判知两个操作数x或y中有一个数为0,即可得知运算结果而没有必要再进展后续的一系列操作以节省运算时间。
0操作数检查步骤如此用来完成这一功能。
参加加法运算的数据都是非零,进入下一步。
b〕比拟价码大小并完成对阶
为了便于直观理解,假设两数均以补码表示,阶码采用双符号位,尾数采用单符号位。
两浮点数进展加减,首先要看两数的阶码是否一样,假如二数阶码不同,表示小数点位置没有对齐,此时必须使二数阶码一样,这个过程叫作对阶。
对阶操作规定使尾数右移,尾数右移后阶码作相应增加,因此对阶时,总是使小阶向大阶看齐。
c〕尾数进展加减运算
对阶完毕后,即可进展尾数的求和运算。
不论加法运算还是减法运算,都按加法进展操作(减法利用补码减法转换成补码的加法来做),其方法与定点加减法运算完全一样。
d〕结果规格化
①采用双符号位表示尾数时,如果两符号位为01或10时,应将结果尾数右移一位,阶码加1〔叫“右规〞〕。
②如果尾数最高数值位与符号位一样,应将尾数左移,阶码减1,直至数值位最高位与符号位相反〔叫“左规〞〕。
e〕舍入运算
在对阶向右规格化,尾数向右移位,这样被右移的尾数的低位局部会被丢掉,从而造成一定误差,要进展舍入处理。
简单的舍入方法有两种:
一种是“0舍1入〞法,即如果右移时被丢掉数位的最高位为0如此舍去,为1如此将尾数的末位做加加1运算。
另一种是“恒置1〞法,即只要数位被移掉,就在尾数的末尾恒置1。
f〕判断结果是否溢出
阶码为00011,阶码的符号位为00,根据补码的双符号检测溢出的方法确定阶码不溢出。
4、设计小结
通过这次的计算机组成原理的课程设计,把我很多不懂的内容又学习了一遍,又巩固了很多。
使我对计算机的认识有了更进一步的加深和认知。
在这为期一周的课程设计的期间内,在进展课程设计的过程中,我不仅巩固了以往所学过的知识,还学到了许多在课堂上所学不到的东西,比如动手能力,实际问题的解决能力和与团队中成员的团队协作与配合的能力,这都使我受益匪浅。
但是我自己有很多不会的知识点,有很大一局部是同学们告诉我的。
也有很多是自己在书本上学习到得当初在学习的时候并没有好好的学习所
在做这个的时候比拟困难。
经过了这次的课程设计,我想,对于我日后的计算机的相关的学习肯定会有诸多助益与影响,为将来的学习生活打下了坚实的根底。
以后在遇到这些就不会无从下手了。
参考文献
[1]白中英.计算机组成原理〔第五版〕[M].:
科学,2010.
[2]吴萍.java程序设计(第一版)[M].:
清华大学2006.
附录
NewClass.java
publicstaticvoidmain(Stringargs[]){
newNewclass("计算机组成原理");}
publicvoidactionPerformed(ActionEvente)
{Strings=newString("000");if(e.getSource()==button1)
{while(i==0&&m<=3&&(!
(text1.getText().equals("")))){if(text1.getText().equals(s))
{i=1;
JOptionPane.showMessageDialog(this,"口令正确,请选择菜单栏的操作",
"正确",JOptionPane.INFORMATION_MESSAGE);
text1.setEnabled(false);
text1.setVisible(false);
a22.setVisible(true);
a2.setVisible(false);}else{m++;
JOptionPane.showMessageDialog(this,"您输入的口令不正确","警告",
JOptionPane.WARNING_MESSAGE);text1.setText(null);}}
if(m>3){
JOptionPane.showMessageDialog(this,"您三次口令错误,确定后退出!
","警告",
JOptionPane.ERROR_MESSAGE);System.exit(0);}}
if(i==1){if(e.getSource()==m1){Form2s1=newForm2();
s1.setVisible(true);}elseif(e.getSource()==m2){
Form3f1=newForm3();f1.setTitle("定点整数单符号位补码加减");f1.setVisible(true);}elseif(e.getSource()==m3){Form4f2=newForm4();f2.setTitle("定点整数补乘法");f2.setVisible(true);}elseif(e.getSource()==m4){Form5f5=newForm5();f5.setVisible(true);}}}}
Form2.java
publicvoidmouseClicked(MouseEvente){
ponent=null;
if(e.getSource()==button2){
=(ponent)e.getSource();
e=SwingUtilities.convertMouseEvent(,e,this);
Strings=text1.getText();
booleanboo=s.startsWith("0",0);
if(boo==true){
n1=s.length();
s1=s.substring(1,n1);
text2.setText("+"+s1);
}else{n1=s.length();
s1=s.substring(1,n1);
text2.setText("-"+s1);}
}elseif(e.getSource()==button1){text1.setText("");}
if(e.getSource()==button3){s=text1.getText();
booleanboo=s.startsWith("0",0);
if(boo==true){n1=s.length();
s1=s.substring(1,n1);
text2.setText("+"+s1);
}else{n1=s.length();
s1=s.substring(1,n1);
chara[]=s1.toCharArray();
for(i=0;i<=a.length-1;i++){if(a[i]=='0')
a[i]='1';
elseif(a[i]=='1')
a[i]='0';}
for(i=0;i<=a.length-1;i++){s1=String.valueOf(a);}
text2.setText("-"+s1);}}
if(e.getSource()==button4){
s=text1.getText();
booleanboo=s.startsWith("0",0);
if(boo==true){n1=s.length();
s1=s.substring(1,n1);
text2.setText("+"+s1);
}else{n1=s.length();
s1=s.substring(1,n1);
j=s1.lastIndexOf("1")+1;
s1=s.substring(1,j);
chara[]=s1.toCharArray();
for(i=0;i<=a.length-1;i++){if(a[i]=='0')
a[i]='1';
elseif(a[i]=='1')
a[i]='0';}
for(i=0;i<=a.length-1;i++){s1=String.valueOf(a);}
temp=s.substring(j,n1);
text2.setText("-"+s1+temp);}}
if(e.getSource()==button5){=(ponent)e.getSource();
e=SwingUtilities.convertMouseEvent(,e,this);
Strings=text1.getText();
booleanboo=s.startsWith("0",0);
if(boo==false){n1=s.length();
s1=s.substring(1,n1);
text2.setText("+"+s1);
}else{n1=s.length();
s1=s.substring(1,n1);
j=s1.lastIndexOf("1")+1;
s1=s.substring(1,j);
chara[]=s1.toCharArray();
for(i=0;i<=a.length-1;i++){if(a[i]=='0')
a[i]='1';
elseif(a[i]=='1')
a[i]='0';}
for(i=0;i<=a.length-1;i++){s1=String.valueOf(a);}
temp=s.substring(j,n1);
text2.setText("-"+s1+temp);}}
if(e.getSource()==button6){=(ponent)e.getSource();
e=SwingUtilities.convertMouseEvent(,e,this);
Newclasspp=newNewclass(null);
setVisible(false);
pp.setVisible(true);}}}
For3.java
publicvoidwindowClosing(WindowEvente){setVisible(false);}});
validate();}
char[]bu(char[]in){
charc=in[0];
if(c=='1'){
charcarry='0';
inti;
chartemp[]=in;
for(i=1;i<=temp.length-1;i++){
if(temp[i]=='0')
temp[i]='1';
elseif(temp[i]=='1')
temp[i]='0';}
if(temp[temp.length-1]=='0'){
temp[temp.length-1]='1';
carry='0';}
elseif(temp[temp.length-1]=='1'){
temp[temp.length-1]='0';carry='1';}
for(i=temp.length-2;i>=0;i--){
if(temp[i]=='0'&&carry=='0'){
temp[i]='0';carry='0';
}elseif(temp[i]=='0'&&carry=='1'){
temp[i]='1';carry='0';
}elseif(temp[i]=='1'&&carry=='0'){
temp[i]='1';carry='0';
}elseif(temp[i]=='1'&&carry=='1'){
temp[i]='0';carry='1';}}
in=temp;}
returnin;}
char[]jia(char[]in1,char[]in2){
char[]out;
charcarry[]=newchar[in1.length+1];inti=0;
out=in1;
carry[carry.length-1]='0';for(i=in1.length-1;i>=0;i--){if(in1[i]=='0'&&in2[i]=='0'&&carry[i+1]=='0'){
out[i]='0';carry[i]='0';}
elseif(in1[i]=='0'&&in2[i]=='1'&&carry[i+1]=='0'){out[i]='1';carry[i]='0';
}elseif(in1[i]=='1'&&in2[i]=='0'&&carry[i+1]=='0'){out[i]='1';carry[i]='0';
}elseif(in1[i]=='1'&&in2[i]=='1'&&carry[i+1]=='0'){out[i]='0';carry[i]='1';
}elseif(in1[i]=='0'&&in2[i]=='0'&&carry[i+1]=='1'){out[i]='1';carry[i]='0';
}elseif(in1[i]=='0'&&in2[i]=='1'&&carry[i+1]=='1'){out[i]='0';carry[i]='1';
}elseif(in1[i]=='1'&&in2[i]=='0'&&carry[i+1]=='1'){out[i]='0';carry[i]='1';
}elseif(in1[i]=='1'&&in2[i]=='1'&&carry[i