计算机组成原理变形补码计算

22. 已知 x 和 y,用变形补码计算 x-y,同时指出结果是否溢出。

(1) x=11011,y=-11111

(2) x=10111,y=11011 

(3) x=11011,y=-10011

24. 已知 x 和 y,用变形补码计算 x+y,同时指出结果是否溢出。

(1)x=11011,y=00011
(2)x=11011,y=-10101
(3)x=-10110,y=-00001

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
int question = 0;
string fu(string str) {
    if (str[0] == '0') {
        str.replace(0, 2, "11");
    } else {
        str.replace(0, 2, "00");
    }
    return str;
}
string fanMa(string str) {
    for (int i = 2; i < str.length(); i++) {
        if (str[i] == '0') {
            str[i] = '1';
        } else {
            str[i] = '0';
        }
    }
    return str;
}
// 正数的原码反码补码都一样, 负数补码是反码+1
string buMa(string str) {
    if (str[0] == '1') {
        str = fanMa(str);
        int flag = 1; // 标记要进位1
        for (int i = str.length() - 1; i >= 0; i--) {
            if (str[i] == '0') {
                if (flag) {
                    flag = 0;
                    str[i] = '1';
                }
            } else if (str[i] == '1') {
                if (flag) {
                    str[i] = '0';
                }
            }
        }
    }
    return str;
}
string minus1(string str) {
    // 相当于找到最后一个1变成0,最后一个1前的0都变成1
    int flag = -1;
    for (int i = str.length() - 1; i >= 0; i--) {
        if (str[i] == '0') {
            if (flag) {
                str[i] = '1';
            }
        } else if (str[i] == '1') {
            if (flag) {
                flag = 0;
                str[i] = '0';
            }
        }
    }
    return str;
}
// 从补码转到原码
string B2Y(string str) {
    string res;
    if (str[0] == str[1]) {
        if (str[0] == '0') {
            res = " +";
            res += str.substr(2);
        } else {
            res = " -";
            res += minus1(str.substr(2));
            res = fanMa(res);
        }
    } else {
        if (str[0] == '0') {
            res = "+";
            res += str.substr(1);
        } else {
            res = "-";
            res += minus1(str.substr(1));
            res = fanMa(res);
        }
    }
    return res;
}
void checkOverFlow(string str) {
    if (str.substr(0, 2) == "01") {
        cout << "正溢出" << endl;
    } else if (str.substr(0, 2) == "10") {
        cout << "负溢出" << endl;
    } else {
        cout << "未溢出" << endl;
    }
}
// 输入X和Y的原码, 计算结果
string Cal(string X, string Y, char oper = '+') {
    printf("\n(%d)\n", ++question);
    X = buMa(X);
    cout << "[X]补:   " << X << endl;
    if (oper == '-') {
        Y = fu(Y);
    }
    Y = buMa(Y);
    if (oper == '-') {
        cout << "[-Y]补:  " << Y << endl;
    } else {
        cout << "[Y]补:   " << Y << endl;
    }
    int flag = 0; // 标记是否要进位
    for (int i = X.length() - 1; i >= 0; i--) {
        int cur = X[i] - '0' + Y[i] - '0' + flag;
        if (cur > 1) {
            flag = 1;
        } else {
            flag = 0;
        }
        if (cur & 1) {
            X[i] = '1';
        } else {
            X[i] = '0';
        }
    }
    printf("------------------\n");
    cout << "[X" << oper << "Y]补: " << X << endl;
    cout << " X" << oper << "Y   : " << B2Y(X) << endl;
    checkOverFlow(X);
    return X;
}

int main() {
    system("chcp 65001");
    cin.tie(0);
    cout.tie(0);
    // bitset<7> a(27);
    // string strX = a.to_string();
    Cal("0011011", "0000011");
    Cal("0011011", "1110101");
    Cal("0011011", "1110011", '-');
    return 0;
}

 

nt布置你马的那么多题目...

### 解答过程: #### **1. 变形补码的概念** 变形补码(双符号位补码)是一种特殊的二进制表示形式,用于检测溢出问题。它的特点是最高两位为符号位: - 如果两个符号位均为 `00`,则数值为正; - 如果两个符号位均为 `11`,则数值为负; - 如果两个符号位不同(如 `01` 或 `10`),则表明发生了溢出。 --- #### **2. 转换 x 和 y 的变形补码** **已知:** - \( x = -0.10110 \) - \( y = -0.00001 \) ##### (1) 计算 \( x \) 的变形补码 \( x = -0.10110 \),是一个负数。 - 原码为 `1.xxxxx` 形式,其中小数部分为 `.10110`,因此原码为 `1.10110`。 - 求补码:将小数部分取反加一,得到补码的小数部分为 `.01010`,所以单符号位补码为 `1.01010`。 - 将其转换为变形补码,在前面加上第二个符号位,最终变形补码为 `11.01010`。 ##### (2) 计算 \( y \) 的变形补码 \( y = -0.00001 \),也是一个负数。 - 原码为 `1.yyyyy` 形式,其中小数部分为 `.00001`,因此原码为 `1.00001`。 - 求补码:将小数部分取反加一,得到补码的小数部分为 `.11111`,所以单符号位补码为 `1.11111`。 - 将其转换为变形补码,在前面加上第二个符号位,最终变形补码为 `11.11111`。 **结果填空:** - \( x \) 的变形补码为:(第一空)`11.01010` - \( y \) 的变形补码为:(第二空)`11.11111` --- #### **3. 进行变形补码相加运算** 现在我们对 \( x + y \) 使用变形补码直接相加。 \[ (11.01010)_b + (11.11111)_b \] 按照二进制规则逐位置计算,并处理进位: ``` 11.01010 + 11.11111 ------------- 111.01001 ``` 观察到结果的符号位为 `11`,说明仍然是一个有效的负数表达,未发生溢出。去掉高位多余的符号位后,结果变形补码为 `11.01001`。 --- #### **4. 验证结果是否正确** 从变形补码还原回十进制值验证: - 结果变形补码为 `11.01001`,是负数。 - 其对应的单符号位补码为 `1.01001`,将其转回原码,得 `-0.10111`。 - 因此 \( x + y = -0.10110 - 0.00001 = -0.10111 \),与上述计算一致。 --- ### 最终答案总结 - \( x \) 的变形补码为:(第一空)`11.01010` - \( y \) 的变形补码为:(第二空)`11.11111` - \( x + y \) 的变形补码为:`11.01001` - 是否溢出?**否** ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值