计算机组成原理逻辑运算
组成原理课程设计说明书
计算机组成原理算法实现(三)
专业计算机科学与技术
学生姓名
班级
学号
指导教师
完成日期
1 课程设计目的
本课程设计是在学完本课程教学大纲规定的全部内容、完成所有实践环节的基础上,旨在深化学生学习的计算机组成原理课程基本知识,进一步领会计算机组成原理的一些算法,并进行具体实现,提高分析问题、解决问题的综合应用能力。
2 课程设计内容与要求
内容:计算机组成原理算法实现(五)
要求:课题③能够实现逻辑运算(逻辑非、逻辑加、逻辑乘、逻辑异)、定点整数的单符号位补码加减运算、定点整数的原码一位乘法运算和浮点数的加减运算。
3 功能模块详细设计
3.1 主窗体设计
系统进入(主)窗体的设计:菜单需要在输入口令正确后方可激活使用。口令输入错误时要给出重新输入口令的提示,三次口令输入错误应该禁止使用。具体现实如下:
窗体由visual studio 2017 中c#窗体设计中的各种UI插件完成,如label、button、textbox、messagebox等插件组合完成,在插件的使用中还可以改变字体背景大小颜色,例如我插入了图片,label背景颜色为透明。插件还可以输入口令后直接回车进入
在进入此页面后,未显示任何菜单栏选项,只有正确输入口令后方可进入菜单窗体进行能使用,三次失败后便立即退出,此处用到了if(equal())语句,只有密码相等才可以效果图如下:
这些弹窗均由messagebox插件完成。
3.2菜单窗体
这些便是这次实验设计的所完成的主要功能,包括逻辑运算、定点整数的补码加减,定点整数的原码乘法,浮点数的加减运算.此外,窗体的交替由 hide()和show()方法表示。
3.3 逻辑运算窗体设计
逻辑运算分为逻辑加、逻辑非,逻辑乘和逻辑异,即上课所学的交非并异或四种逻辑运算,主要由textbox插件接收输入的数字,然后通过if语句判断进行结果输出,如非运算就是“1”→“0”,“0”→“1”,通过数组遍历,一个一个往后检查直至全部替换完毕,逻辑乘即是并,逻辑非关键代码如下所示:
if (a[i] == '0') d[i] = '1';
if (a[i] == '1') d[i] = '0';
}
c = new string(d);
通过实体化具体输出后进行数组遍历改变,同理其余的逻辑运算只需要加上if 语句条件,结果效果如下图所示:
另外,输入按钮由foucus()函数控制,点击输入后无论鼠标原来在哪,都会重新在第一行,返回依然是hide() 和show()函数,即隐藏此页面,显示菜单窗体。
3.4 定点整数的单符号位加减运算
加减运算通过求出原码反码补码然后利用补码进行加法运算,运用到了自定义函数,附于附录之中。首先定义原码函数,即将符号位换位0或1表示,接着运用if函数进行取反,最后判断最后一位求出补码。效果图如下
如果是减法的话,便是求出第二个数相反数的补码,再次相加,此时再自定义三个函数,唯一区别在于原码,即如果是“+”是“0”,而“-”是“1”,最后补码套用加法函数这样:
this.no4.Text=(AddBinary(BM(FM(YM(this.no1.Text))),BM(FM(JYM(this.no2.Te xt)))));效果图如下:
3.5 定点整数的原码乘法窗体设计
定点整数原码的乘法,是基于加法之上的,在进行每一次求积的过程时,都需要将乘积保存下来,按照我的设计思路,实现方法如下所述:
首先,创建BYM()函数,这个函数的目的是将带符号的定点整数化为原码进行此后的运算,然后开始一位一位的进行乘法运算,最后,乘法的关键,自定义了一个乘法函数YMYWmultip(),自己理解的位置的关系进行加法,最后,通过逻辑异或运算,即同号为0,保证结果的符号正确。
3.6 浮点数的加减运算窗体设计
浮点数的加减运算是上课时老师一步一步做的,在实现这个功能时,逻辑是与写题时相同的,首先将阶码和尾数变成原码,接着反码、补码。第一步,对阶,第一个数和第二个数进行对阶,产生偏移量改变阶码,第二步,尾数求和,尾数的补码相加,第三步,规格化,再次产生偏移量,改变阶码,继而进行尾数处理,最后,判断溢出。再次让补码变成原码输出。而减法不同的便是尾数求和这一步,原理与前面的单符号位加减运算相同,区别在于符号位由一位变为两位。以上均要判断正负溢出,具体在代码之中,效果图如下:
3.7 窗体的美观设计
在c#窗体设计中,有许多可以美观优化的地方,这些均可以使用插件的属性进行设计改变。如:
颜色,字体大小,名称,背景图片都可以在这一栏进行设计,比如,我在插件background中插入图片,其余插件为透明色,边框为粉红,窗体弹出设为居中,使窗体更美观简洁。
4 设计小结
这次计算机组成原理课设大大提升了我的c#编程能力,原先没有掌握的的数据类型转换,基本函数也在大脑中留下了记忆,在这次实验中,同学们积极讨论,使自己对于补码和浮点数的相关知识得到了夯实巩固,其原理得到了理解,感谢于同学的帮助,原先我们大部分是编程控制台代码,这一次,是窗体设计,受益良多,自身又得到了提高。
参考文献
[1] 白中英. 计算机组成原理(第五版)[M]. 北京: 科学出版社, 2010.
[1] 明日科技. c#从入门到精通(第三版)[M]. 北京: 清华大学出版社, 2010.
附录代码
主窗体代码
public partial class Form1 : Form
{
int n = 3;
public Form1()
{
InitializeComponent();
}
private void groupBox1_Enter(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
string kl = this.textBox1.Text;
if (kl.Equals(""))
{
n--;
MessageBox.Show("口令不能为空!你还有" + n + "次机会");
}
else
{
if (kl.Equals("111"))
{
MessageBox.Show("登录成功!");
new Form7().Show();
this.Hide(); }
else
{
n--;
MessageBox.Show("口令错误!你还有"+n+"次机会");
}
}
if (n < 1) { this.Close(); }
}
private void
textBox1_TextChanged(object sender, EventArgs e) {
}
private void Form1_Load(object sender, EventArgs e)
{
}
}
菜单代码:
public partial class Form7 : Form
{
public Form7()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
new Form2().Show();
this.Hide();
}
private void button2_Click(object sender, EventArgs e)
{
new Form3().Show();
this.Hide();
}
private void button3_Click(object sender, EventArgs e)
{
new Form4().Show();
this.Hide();
}
private void button4_Click(object sender, EventArgs e)
{
new Form5().Show();
this.Hide();
}
private void Form7_Load(object sender, EventArgs e)
{ }}
逻辑运算窗体代码:
namespace WindowsFormsApp1
{
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void label2_Click(object sender, EventArgs e)
{
}
private void button6_Click(object sender, EventArgs e)
{
new Form7().Show();
this.Hide();
}
private void button1_Click(object sender, EventArgs e)
{
no1.Focus();
}
private void label1_Click(object sender, EventArgs e)
{
}
private void button2_Click(object sender, EventArgs e) {
string a = this.no1.Text;
char[] b = a.ToCharArray();
string c = this.ans.Text;
int l = this.no1.Text.Length;
char[] d = new char[l];
for (int i = 0; i < l; i++)
{
if (b[i] != '0' && b[i] != '1') {
MessageBox.Show("只能输入
0或1");
}
else
{
if(a[i] == '0') d[i] = '1';
if(a[i] == '1') d[i] = '0'; }
c = new string(d);
this.ans.Text = c;
}
}
private void button3_Click(object sender, EventArgs e)
{
string a = this.no1.Text;
char[] b = a.ToCharArray();
string c = this.ans.Text;
string f = this.no2.Text;
char[] g = f.ToCharArray();
int l = this.no1.Text.Length;
char[] d = new char[l];
for (int i = 0; i < l; i++)
{
if (b[i] != '0' && b[i] != '1') {
MessageBox.Show("只能输入
0或1");
}
else
{
if(a[i]=='0'&& g[i]=='0') d[i] = '0';
else d[i] = '1';
}
}
c = new string(d);
this.ans.Text = c;
}
private void button4_Click(object sender, EventArgs e)
{
string a = this.no1.Text;
char[] b = a.ToCharArray();
string c = this.ans.Text;
string f = this.no2.Text;
char[] g = f.ToCharArray();
int l = this.no1.Text.Length;
char[] d = new char[l];
for (int i = 0; i < l; i++)
{
if (b[i] != '0' && b[i] != '1') {
MessageBox.Show("只能输入
0或1");
}
else{ if (a[i] == '1' && g[i] == '1') d[i] = '1';
else d[i] = '0'; }
}
c = new string(d);
this.ans.Text = c;
}
private void button5_Click(object sender, EventArgs e)
{
string a = this.no1.Text;
char[] b = a.ToCharArray();
string c = this.ans.Text;
string f = this.no2.Text;
char[] g = f.ToCharArray();
int l = this.no1.Text.Length;
char[] d = new char[l];
for (int i = 0; i < l; i++)
{
if (b[i] != '0' && b[i] != '1') { MessageBox.Show("只能输入
0或1");
}
else
{
if(a[i] == g[i]) d[i] = '0';
else d[i] = '1';
}
}
c = new string(d);
this.ans.Text = c;
}
private void no1_TextChanged(object sender, EventArgs e)
{
}
private void Form2_Load(object sender, EventArgs e)
{
} }}
定点整数的单符号位补码加减运算窗体:
namespace WindowsFormsApp1
{
public partial class Form3 : Form
{
public Form3()
{
InitializeComponent();
}
public string YM(string n)
{
string ym;
if (n.Substring(0, 1) == "+")
{
//输入的是正数,符号位输出0
ym = "0" + n.Substring(1,
n.Length - 1);
}
else if (n.Substring(0, 1) == "-") {
ym = "1" + n.Substring(1,
n.Length - 1);
}
//输入的是负数,符号位输出1
else
{
MessageBox.Show("请输入符号");
return"数据出错!";
}
return ym;
}
public string JYM(string n)
{
string jym;
if (n.Substring(0, 1) == "+")
{
//输入的是正数,符号位输出0
jym = "1" + n.Substring(1,
n.Length - 1);
}
else if (n.Substring(0, 1) == "-") {
jym = "0" + n.Substring(1,
n.Length - 1);
}
//输入的是负数,符号位输出1
else
{
MessageBox.Show("请输入符号");
return"数据出错!";
}
return jym;
}
public string JFM(string jym)
{
string jfm = jym.Substring(0, 1);
if (jym.Substring(0, 1) == "0")
{
//输入的是正数
jfm = jym;
}
else if(jym.Substring(0, 1) == "1") {
for (int i = 1; i < jym.Length; i++)
{
if (jym.Substring(i, 1) == "0") jfm = jfm + "1";
else if(jym.Substring(i, 1) == "1") jfm = jfm + "0";
}
}
return jfm;
}
public string FM(string ym)
{
string fm=ym.Substring (0,1);
if (ym.Substring(0, 1) == "0")
{
//输入的是正数
fm=ym;
}
else if (ym.Substring(0, 1) == "1") {
for(int i=1;i if (ym.Substring(i, 1) == "0") fm = fm + "1"; else if(ym.Substring(i, 1) == "1") fm = fm + "0"; } } return fm; } private static string AddBinary(string a, string b) { //找出最长的加1,留1位进位 var max = Math.Max(a.Length, b.Length) + 1; //按总长度补位,以便统一处理,否则要考虑边界 var a2 = a.PadLeft(max, '0'); var b2 = b.PadLeft(max, '0'); //定义list存中间计算结果 var list = new List //进位标志 var carryFlag = false; for (int i = max - 1; i >= 0; i--) { var add = int.Parse(a2[i].ToString()) + int.Parse(b2[i].ToString()); //计算当前位的值,如果之前进位 标志为真,则额外+1 if (carryFlag) add++; //大于等于2时,此时仍然需要进位,带入下一次循环 carryFlag = add >= 2; //存入中间计算结果 list.Add(add % 2); } //定义结果 var res = string.Empty; //反转,list是按逆序从低位到高位的 list.Reverse(); //遍历输出到res list.ForEach(r => { res += r.ToString(); }); //取消最高位0 res = res.Substring(1, res.Length - 1); //res = res.TrimStart('0'); //如果空了,返回0 if (res.Length == 0) res = "0"; //返回结果 return res; } public string BM(string fm) { string bm = fm.Substring(0, 1); if (fm.Substring(0, 1) == "0") { //输入的是正数 bm = fm; } else if (fm.Substring(0, 1) == "1") { if(fm.Substring(fm.Length - 1, 1) == "0") bm = fm.Substring (0,fm.Length -1) + "1"; else if(fm.Substring(fm.Length - 1, 1) == "1") bm = AddBinary(fm, "1"); } return bm; } public string JBM(string jfm) { string jbm = jfm.Substring(0, 1); if (jfm.Substring(0, 1) == "0") { //输入的是正数 jbm = jfm; } else if(jfm.Substring(0, 1) == "1") { if (jfm.Substring(jfm.Length - 1, 1) == "0") jbm = jfm.Substring (0,jfm.Length -1) + "1"; else if (jfm.Substring(jfm.Length - 1, 1) == "1") jbm = AddBinary(jfm, "1"); } return jbm; } private void label5_Click(object sender, EventArgs e) { } private void label3_Click(object sender, EventArgs e) { } private void button4_Click(object sender, EventArgs e) { new Form7().Show(); this.Hide(); } private void button1_Click(object sender, EventArgs e) { no1.Focus(); } private void Form3_Load(object sender, EventArgs e) { } private void no1_TextChanged(object sender, EventArgs e) { } private void button2_Click(object sender, EventArgs e ) { this.no3.Text = AddBinary(BM(FM(YM(this.no1.Text))), BM(FM(YM(this.no2.Text)))); } private void no4_TextChanged(object sender, EventArgs e) { } private void button3_Click(object sender, EventArgs e) { /* MessageBox.Show(YM(this.no1.Text)); MessageBox.Show(FM(YM(this.no1.Text))); MessageBox.Show(BM(FM(YM(this.no1.Text)))); MessageBox.Show(YM(this.no2.Text)); MessageBox.Show(FM(YM(this.no2.Text))); MessageBox.Show(BM(FM(YM(this.no2.Text))));*/ this.no4.Text = (AddBinary(BM(FM(YM(this.no1.Text))), BM(FM(JYM(this.no2.Text))))); } } } 定点整数的原码乘法 public static string BYM(string n)//无符号原码 { string ym; if (n.Substring(0, 1) == "+") { //输入的是正数,符号位输出0 ym = n.Substring(1, n.Length - 1); } else if (n.Substring(0, 1) == "-") { ym = n.Substring(1, n.Length - 1); } //输入的是负数,符号位输出1 else { MessageBox.Show("请输入符号"); return"数据出错!"; } string temp = ym.Substring(0, 1); if (ym.Length < 8) { for(int m = 1; m <= 8 - ym.Length; m++) { temp = temp + "0"; } } return ym; } public string YMYWmultip(string bcym, string cym) { int bclen = bcym.Length; int clen = cym.Length; string sum = "0"; //string []sum = new string[] { }; for (int i = clen - 1; i >= 0; i--) { if (cym.Substring(i, 1) == "1") { //MessageBox.Show(bcym.PadRight(bclen + clen - i - 1, '0')); sum = AddBinary(sum, bcym.PadRight(bclen + clen - i - 1, '0')); } } return sum; } private static string AddBinary(string a, string b) { //找出最长的加1,留1位进位 var max = Math.Max(a.Length, b.Length) + 1; //按总长度补位,以便统一处理,否则要考虑边界 var a2 = a.PadLeft(max, '0'); var b2 = b.PadLeft(max, '0'); //定义list存中间计算结果 var list = new List //进位标志 var carryFlag = false; for (int i = max - 1; i >= 0; i--) { var add = int.Parse(a2[i].ToString()) + int.Parse(b2[i].ToString()); //计算当前位的值,如果之前进位标志为真,则额外+1 if (carryFlag) add++; //大于等于2时,此时仍然需要进位,带入下一次循环 carryFlag = add >= 2; //存入中间计算结果 list.Add(add % 2); } //定义结果 var res = string.Empty; //反转,list是按逆序从低位到高位的 list.Reverse(); //遍历输出到res list.ForEach(r => { res += r.ToString(); }); //取消最高位0 res = res.TrimStart('0'); //如果空了,返回0 if (res.Length == 0) res = "0"; //返回结果 return res; } private void button3_Click(object sender, EventArgs e) { new Form7().Show(); this.Hide(); } private void textBox1_TextChanged(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { no1.Focus(); } private void button2_Click(object sender, EventArgs e) { ans.Text = YMYWmultip(BYM(no1.Text), BYM(no2.Text)); bool cf1 = true, cf2 = true; if(no1.Text.Substring(0, 1) == "+") { cf1 = true; } else if(no1.Text.Substring(0, 1) == "-") cf1 = false; if(no2.Text.Substring(0, 1) == "+") { cf2 = true; } else if(no2.Text.Substring(0, 1) == "-") cf2 = false; if (cf1 ^ cf2 == true) { ans.Text = "-" + ans.Text; } else ans.Text = "+" + ans.Text; } } } 浮点数的加减运算 namespace WindowsFormsApp1 { public partial class Form5 : Form { public Form5() { InitializeComponent(); } public static string AddBinary(string a, string b) { //找出最长的加1,留1位进位 var max = Math.Max(a.Length, b.Length) + 1; //按总长度补位,以便统一处理,否则要考虑边界 var a2 = a.PadLeft(max, '0'); var b2 = b.PadLeft(max, '0'); //定义list存中间计算结果 var list = new List //进位标志 var carryFlag = false; for (int i = max - 1; i >= 0; i--) { var add = int.Parse(a2[i].ToString()) + int.Parse(b2[i].ToString()); //计算当前位的值,如果之前进位标志为真,则额外+1 if (carryFlag) add++; //大于等于2时,此时仍然需要进位,带入下一次循环 carryFlag = add >= 2; //存入中间计算结果 list.Add(add % 2); } //定义结果 var res = string.Empty; //反转,list是按逆序从低位到高位的 list.Reverse(); //遍历输出到res list.ForEach(r => { res += r.ToString(); }); //取消最高位0 //res = res.TrimStart('0'); //如果空了,返回0 if (res.Length == 0) res = "0"; //返回结果 return res; } public static string BXYM(string n)//变形原码 { string ym; if (n.Substring(0, 1) == "+") { //输入的是正数,符号位输出0 ym = "00" + n.Substring(1, n.Length - 1); } else if (n.Substring(0, 1) == "-") { ym = "11" + n.Substring(1, n.Length - 1); } //输入的是负数,符号位输出1 else if (n.Substring(0, 2) == "01" || n.Substring(0, 2) == "10") { ym = "11" + n.Substring(2, n.Length - 2); } //正溢出或负溢出 else if (n.Substring(0, 2) == "11" || n.Substring(0, 2) == "00") { ym = n; } else { MessageBox.Show("请输入符号"); return "数据出错!"; } string temp = ym.Substring(0, 2); if (ym.Length < 8) { for (int m = 1; m <= 8 - ym.Length; m++) { temp = temp + "0"; } ym = temp + ym.Substring(2, ym.Length - 2); } return ym; } public static string BXFM(string ym)//变形反码 { string fm = ym.Substring(0, 2); if (ym.Substring(0, 2) == "00") { //输入的是正数 fm = ym; } else if (ym.Substring(0, 2) == "11") { for (int i = 2; i <= ym.Length - 1; i++) { if (ym.Substring(i, 1) == "0") { fm = fm + "1"; } else if (ym.Substring(i, 1) == "1") fm = fm + "0"; } } //输入的是负数 else { MessageBox.Show("请输入符号"); return "数据出错!"; } return fm; } public static string BXBM(string fm) //变形补码 { string bm = fm.Substring(0, 2); if (fm.Substring(0, 2) == "00") { bm = fm; } else if (fm.Substring(0, 2) == "11") { if (fm.Substring(fm.Length - 1, 1) == "0") { bm = fm.Substring(0, fm.Length - 1) + "1"; } else { bm = AddBinary(fm, "1"); } } return bm; } public static string AddBinaryF(string input1, string input2) { int strlen = Math.Max(input1.Length, input2.Length) + 1; string output; output = AddBinary(BXBM(BXFM(BXYM(input1))), BXBM(BXFM(BXYM(input2)))); if (output.Length > strlen) { //MessageBox.Show("过长溢出"); output = output.Substring(output.Length - strlen, strlen); } if (output.Substring(0, 2) == "01") { //正溢出 output = BXBM(BXFM(BXYM(output))); if (output.Length > strlen) { //MessageBox.Show("过长溢出"); output = output.Substring(output.Length - strlen, strlen); } MessageBox.Show("存在正溢出,计算补码结果"); output = "00" + output.Substring(2, output.Length - 2); } else if (output.Substring(0, 2) == "10") { //负溢出 output = BXBM(BXFM(BXYM(output))); if (output.Length > strlen) { //MessageBox.Show("过长溢出"); output = output.Substring(output.Length - strlen, strlen); } MessageBox.Show("存在负溢出,计算补码结果"); output = "11" + output.Substring(2, output.Length - 2); } else if (output.Substring(0, 2) == "11") { //负溢出 output = BXBM(BXFM(BXYM(output))); if (output.Length > strlen) { //MessageBox.Show("过长溢出"); output = output.Substring(output.Length - strlen, strlen); } MessageBox.Show("结果为负,计算 补码结果"); output = "11" + output.Substring(2, output.Length - 2); } return output; } private void label2_Click(object sender, EventArgs e) { } private void TextBox1_TextChanged(object sender, EventArgs e) { } private void button4_Click(object sender, EventArgs e) { new Form7().Show(); this.Hide(); } private void button1_Click(object sender, EventArgs e) { no1.Focus(); } private void button2_Click(object sender, EventArgs e) { string e1, e2, m1, m2, m0, e0; string m1r = "", m2r = ""; int strlen, erm = 0, mlm = 0; string em = ""; string inputcl = ""; int e10, e20, e00; if (no3.Text.Substring(0, 1) == "+") { inputcl = "-" + (no3.Text.Substring(1, no3.Text.Length - 1)); } else if (no3.Text.Substring(0, 1) == "-") { inputcl = "+" + (no3.Text.Substring(1, no3.Text.Length - 1)); } //e1 = BXBM(BXFM(BXYM(no1.Text))); //e2 = BXBM(BXFM(BXYM(inputcl))); strlen = Math.Max(no1.Text.Length, no3.Text.Length) + 1; //e0 = AddBinary(e1, e2); //MessageBox.Show(e0.Length +"|"+strlen); //if (e0.Length > strlen) //{ e0 = e0.Substring(e0.Length - strlen, strlen); } m1 = no2.Text.Substring(3, 6); m2 = no4.Text.Substring(3, 6); e1 = Form4.BYM(no1.Text); e2 = Form4.BYM(no3.Text); if (no1.Text.Substring(0, 1) == "+") { e10 = System.Convert.ToInt32(e1, 2) * 1; } else e10 = System.Convert.ToInt32(e1, 2) * -1; if (no3.Text.Substring(0, 1) == "+") { e20 = System.Convert.ToInt32(e2, 2) * 1; } else e20 = System.Convert.ToInt32(e2, 2) * -1; e00 = e10 - e20; if (e00 >= 0) { em = no1.Text; erm = e00; MessageBox.Show("阶码对齐,e1大,e2偏移量:" + erm); } else { em = no3.Text; erm = e00 * -1; MessageBox.Show("阶码对齐,e2大,e1偏移量:" + erm); } //for (int i = 0; i <= erm; i++) //{ if (em == no1.Text) { m2r = m2.Substring(m2.Length - erm, erm); m2 = m2.Substring(0, m2.Length - erm); MessageBox.Show(m2); m2 = m2.PadLeft(6, '0'); MessageBox.Show(m2 + "(" + m2r + ")"); } else { m1r = m1.Substring(m1.Length - erm, erm); m1 = m1.Substring(0, m1.Length - erm); MessageBox.Show(m1); m1 = m1.PadLeft(6, '0'); MessageBox.Show(m1 + "(" + m1r + ")"); } m1 = no2.Text.Substring(0, 1) + m1; m2 = no4.Text.Substring(0, 1) + m2; //MessageBox.Show(m1); //MessageBox.Show(m2); m0 = AddBinary(BXBM(BXFM(BXYM(m1))), BXBM(BXFM(BXYM(m2)))); //MessageBox.Show(m0); if (m0.Length > 8) { //MessageBox.Show("过长溢出"); m0 = m0.Substring(m0.Length - 8, 8); } if (m0.Substring(0, 2) == "01") { //正溢出 m0 = BXBM(BXFM(BXYM(m0))); if (m0.Length > 8) { //MessageBox.Show("过长溢出"); m0 = m0.Substring(m0.Length - 8, 8); } MessageBox.Show("存在正溢出,计算补码结果:" + m0); m0 = "00" + m0.Substring(2, m0.Length - 2); mlm = m0.Substring(2, m0.Length - 2).IndexOf('1');