前言:浮点数的加减法与是否溢出的判断,是计算机组成原理中的数据存储的一个入门。
题目:已知x和y,用变形补码计算x+y,并判断结果是否溢出。
(1)x = 0.11010, y = 0.10111
(2)x = 0.11101, y = -0.10100
(3)x = -0.10111, y = -0.11000
计算方法很简单,就是先把x, y转换成补码,然后补码相加就可以,计算机的计算中都是把减法当做加法使用。对于负数那么就在原来的基础之上前面加一个1,作为符号位,然后符号位不变再取反加一。
比如:
对于(2)题
-0.11010->10.11010->11.00101->11.00110
然后相加,结果为:
00.11101+11.00110=00.01001
至于溢出情况,如果01就是正溢出,00,11未溢出,10负溢出。
知道原理了,然后我们就可以写代码了。
我的代码如下:
#include<bits/stdc++.h>
using namespace std;
string Complement(string code) // 对二进制浮点数求补码
{
string t = '1' + code;
// 是否进位
bool flag = false;
// 先求反码
for (int i = t.size() - 1; i >= 1; -- i)
{
if (t[i] == '.') continue;
if (t[i] == '0') t[i] = '1';
else t[i] = '0';
}
// cout << "反码为:" + t << endl;
// 再加1
for (int i = t.size() - 1; i >= 1; -- i)
{
// cout << "补码为:" + t << endl;
if (t[i] == '.') continue;
if (i == t.size() - 1) // 求反加1
{
if (t[i] == '1')
{
flag = true;
t[i] = '0';
}
else t[i] = '1';
}
else
{
if (flag == true) // 有进位
{
if (t[i] == '0') // 不需要进位
{
flag = false;
t[i] = '1';
}
else // 需要进位
{
flag = true;
t[i] = '0';
}
}
}
}
// cout << "补码为:" + t << endl;
return t;
}
string Add(string x, string y) // 补码相加
{
bool flag = false; // 判断是否进位
string res = "";
for (int i = x.size() - 1; i >= 0; -- i)
{
// cout << "res :" + res << " ";
// if (flag) cout << "true\n";
// else cout << "false\n";
if (x[i] == '.')
{
res += '.';
continue;
}
if (x[i] == y[i] && x[i] == '1')
{
if (flag) res += '1';
else res += '0';
flag = true;
}
else if (x[i] == y[i] && x[i] == '0')
{
if (flag)
{
res += '1';
flag = false;
}
else res += '0';
}
else if (x[i] != y[i]) // 两个不同
{
if (flag) // 有进位
{
flag = true;
res += '0';
}
else // 没有进位
{
flag = false;
res += '1';
}
}
}
reverse(res.begin(), res.end());
return res;
}
string Jude(string res) // 判断是否溢出
{
if (res[0] == res[1]) return "未溢出";
else if (res[0] == '1') return "负溢出";
else return "正溢出";
}
int main()
{
string x, y;
string res = "";
cout << "输入x:";
cin >> x;
cout << "输入y:";
cin >> y;
string tx = x;
string ty = y;
if (x[0] == '-') // 如果是负数 那么它的补码就需要变一下
{
tx = Complement(x.substr(1));
}
else tx = '0' + x;
if (y[0] == '-')// 如果是负数 那么它的补码就需要变一下
{
ty = Complement(y.substr(1));
}
else ty = '0' + y;
// res = Add(tx, ty); // 这部分为计算[x+y]的情况
// cout << "\n[x + y]补=" + res + '\n';
// cout << "溢出情况为:" + Jude(res) + '\n';
if (y[0] == '-') // // 这部分为计算[x-y]的情况
{
y[0] = '0';
res = Add(tx, y);
}
else res = Add(tx, Complement(y));
cout << "[x - y]补=" + res + '\n';
cout << "溢出情况为:" + Jude(res) + '\n';
return 0;
}
测试结果如下: