计算机组成原理作业:
根据真值输出对应的原反补码
#include <stdio.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
//********** 二进制整数 ***********
//由真值求原码(二进制整数)
void trueInt_to_truecode(char* bin);
//由原码求反码(二进制整数)
void truecodeInt_to_onecomplement(char* bin);
//由反码求补码(二进制整数)
void onecomplementInt_to_twocomplement(char* bin);
//********** 二进制小数 ***********
//由真值求原码(二进制小数)
void trueDouble_to_truecode(char* bin);
//由原码求反码(二进制小数)
void truecodeDouble_to_onecomplement(char* bin);
//由反码求补码(二进制小数)
void onecomplementDouble_to_twocomplement(char* bin);
int main() {
printf("********** 原反补均采用双符号位 ***********\n");
char intBin[99];
printf("Please input the trueInt:");
scanf("%s", intBin);
printf("********** 原码 ***********\n");
trueInt_to_truecode(intBin);
printf("%s\n", intBin);
printf("********** 反码 ***********\n");
truecodeInt_to_onecomplement(intBin);
printf("%s\n", intBin);
printf("********** 补码 ***********\n");
onecomplementInt_to_twocomplement(intBin);
printf("%s\n", intBin);
char doubleBin[99];
printf("Please input the doubleBin:");
scanf("%s", doubleBin);
printf("********** 原码 ***********\n");
trueDouble_to_truecode(doubleBin);
printf("%s\n", doubleBin);
printf("********** 反码 ***********\n");
truecodeDouble_to_onecomplement(doubleBin);
printf("%s\n", doubleBin);
printf("********** 补码 ***********\n");
onecomplementDouble_to_twocomplement(doubleBin);
printf("%s\n", doubleBin);
return 0;
}
//由真值求原码(二进制整数)
void trueInt_to_truecode(char* bin) {
char newBin[99];
//负数
if (bin[0] == '-') {
//双符号位,负数:11xxx xxx
newBin[0] = newBin[1] = '1';
int i;
for (i = 1; i < strlen(bin); i++) {
newBin[i + 1] = bin[i];
}
newBin[i + 1] = '\0';
}//正数
else if (bin[0] != '-') {
//双符号位,正数:00xxx xxx
newBin[0] = newBin[1] = '0';
int i;
for (i = 0; i < strlen(bin); i++) {
newBin[i + 2] = bin[i];
}
newBin[i + 2] = '\0';
}
strcpy(bin, newBin);
}
//由原码求反码(二进制整数)
void truecodeInt_to_onecomplement(char* bin) {
char newBin[99];
//正数的原反补相同
if (bin[0] == '0' && bin[1] == '0') {
return;
}
else {//负数的原反补要把除符号位的 1 变成 0,0 变成 1
newBin[0] = newBin[1] = '1';
int i;
for (i = 2; i < strlen(bin); i++) {
newBin[i] = bin[i] == '0' ? '1' : '0';
}
newBin[i] = '\0';
strcpy(bin, newBin);
}
}
//由反码求补码(二进制整数)
void onecomplementInt_to_twocomplement(char* bin) {
char newBin[99];
//正数的原反补为相同
if (bin[0] == '0' && bin[1] == '0') {
return;
}
else {
for (int i = 0; i < strlen(bin); i++) {
newBin[i] = bin[i];
}
newBin[strlen(bin)] = '\0';
//bool 用于判断有没有进行进位操作
//0 表示未进位,1 表示进位操作已完成,退出循环
int bool = 0;
for (int i = strlen(bin) - 1; i >= 2 && bool == 0; i--) {
//如果当前位为 0 的话,直接进位就行,并把 bool 改成 1,完成进位操作,退出循环
if (bin[i] == '0') {
newBin[i] = '1';
bool = 1;
}//如果当前为为 1 的话,当前位变为 0,向下一位进 1,继续循环
else {
newBin[i] = '0';
}
}
//反码是 111 这种情况,说明真值为 0,0 的补码是 0
if (bool == 0) {
strcpy(bin, "000");
}
else {
strcpy(bin, newBin);
}
}
}
//由真值求原码(二进制小数)
void trueDouble_to_truecode(char* bin) {
char newBin[99];
if (bin[0] == '0') {
//正数,双符号位:00.xxx xxx
newBin[0] = newBin[1] = '0';
int i;
for (i = 1; i < strlen(bin); i++) {
newBin[i + 1] = bin[i];
}
newBin[i + 1] = '\0';
}
else {
//负数,双符号位:11.xxx xxx
newBin[0] = newBin[1] = '1';
int i;
for (i = 2; i < strlen(bin); i++) {
newBin[i] = bin[i];
}
newBin[i] = '\0';
}
strcpy(bin, newBin);
}
//由原码求反码(二进制小数)
void truecodeDouble_to_onecomplement(char* bin) {
char newBin[99];
//正数的原反补相同
if (bin[0] == '0' && bin[1] == '0') {
return;
}
else {//负数的原反补要把除符号位的 1 变成 0,0 变成 1
newBin[0] = newBin[1] = '1';
newBin[2] = '.';
int i;
for (i = 3; i < strlen(bin); i++) {
newBin[i] = bin[i] == '0' ? '1' : '0';
}
newBin[i] = '\0';
strcpy(bin, newBin);
}
}
//由反码求补码(二进制小数)
void onecomplementDouble_to_twocomplement(char* bin) {
char newBin[99];
//正数的原反补为相同
if (bin[0] == '0' && bin[1] == '0') {
return;
}
else {
for (int i = 0; i < strlen(bin); i++) {
newBin[i] = bin[i];
}
newBin[strlen(bin)] = '\0';
//bool 用于判断有没有进行进位操作
//0 表示未进位,1 表示进位操作已完成,退出循环
int bool = 0;
for (int i = strlen(bin) - 1; i >= 3 && bool == 0; i--) {
//如果当前位为 0 的话,直接进位就行,并把 bool 改成 1,完成进位操作,退出循环
if (bin[i] == '0') {
newBin[i] = '1';
bool = 1;
}//如果当前为为 1 的话,当前位变为 0,向下一位进 1,继续循环
else {
newBin[i] = '0';
}
}
//出现 0.11 变成 0.100 的情况
if (bool == 0) {
strcpy(bin, "0");
}
else {
strcpy(bin, newBin);
}
}
}