据我所知,加法、2 的补码和减法函数按照我的预期工作,这只是打印结果时的一个错误,我认为这与变量类型或字符串长度(其中存在额外空格)有关给出了垃圾值,但我不知道如何修复它
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int parse(char*);
void get2Complement(char *);
void Add(char *num1, char *num2, char *result);
char binary1[100], binary2[100], operator[1], binary3[100];
char result[8];
char binaryOne[] = {'0', '0', '0', '0', '0', '0', '0', '1'};
printf("Enter first binary number: ");
scanf("%s", binary1);
printf("Enter operator (+ or -): ");
scanf(" %c", operator);
printf("Enter second binary number: ");
scanf("%s", binary2);
printf("ORIGINAL NUM2: %s\n\n\n", binary2);
if(!parse(binary1)){
printf("Number 1 Needs to be in Binary!\n");
return 1;
}
if (operator[0] != '+' && operator[0] != '-') {
printf("Operator must be + or -\n");
return 1;
}
if(!parse(binary2)){
printf("Number 2 Needs to be in Binary!\n");
return 1;
}
if (operator[0] == '-') {
get2Complement(binary2);
Add(binary2, binaryOne, binary3);
}else {
Add(binary1, binary2, result);
}
//printing at the end
printf("%s", binary1);
printf("%c", operator[0]);
printf("%s=", binary2);
//printf("\nRESULT: ");
for(int i = 0; i<strlen(result); i++){
printf("%c", result[i]);
}
printf("\nUSING PERCENT S: %s", result);
return 0;
}
int parse(char* binary){
//printf("PARSE FUNCTION STARTS\n");
for (int i = 0; i < strlen(binary); i++) {
if (binary[i] != '0' && binary[i] != '1') {
return 0;
}
}
return 1;
}
void get2Complement(char* complement) {
for (int i = 0; i < strlen(complement); i++) {
if (complement[i] == '0') {
complement[i] = '1';
printf("%c", complement[i]);
continue;
}else{
if(complement[i] == '1'){
complement[i] = '0';
printf("%c", complement[i]);
continue;
}
}
}
}
void Add(char *num1, char *num2, char *result){
char carry[] = {'0', '0','0','0','0','0','0','0'};
unsigned long long x = strlen(num1);
// printf("NUM1LENGTH %llu\n", x);
unsigned long long y = strlen(num2);
// printf("NUM2LENGTH %llu", y);
unsigned long long p = 0;
if(x<=y){
p = y;
}
if(x>y){
p = x;
}
for(int i = 7; i>-1; i--){
if(num1[i] == '1' && num2[i] == '0' && carry[i] == '0'){
result[i] = '1';
carry[i-1] = '0';
continue;
}
if(num1[i] == '1' && num2[i] == '0' && carry[i] == '0'){
result[i] = '1';
carry[i-1] = '0';
continue;
}
if(num1[i] == '0' && num2[i] == '1' && carry[i] == '0'){
result[i] = '1';
carry[i-1] = '0';
continue;
}
if(num1[i] == '0' && num2[i] == '0' && carry[i] == '1'){
result[i] = '1';
carry[i-1] = '0';
continue;
}
if(num1[i] == '1' && num2[i] == '1' && carry[i] == '0'){
result[i] = '0';
carry[i-1] = '1';
continue;
}
if(num1[i] == '0' && num2[i] == '1' && carry[i] == '1'){
result[i] = '0';
carry[i-1] = '1';
continue;
}
if(num1[i] == '1' && num2[i] == '0' && carry[i] == '1'){
result[i] = '0';
carry[i-1] = '1';
continue;
}
if(num1[i] == '0' && num2[i] == '0' && carry[i] =='0'){
result[i] = '0';
carry[i-1] = '0';
continue;
}
if(num1[i] == '1' && num2[i] == '1' && carry[i] == '1'){
result[i] = '1';
carry[i-1] = '1';
continue;
}
}
}
您的代码存在很多问题,但我认为您主要错过了以下两点:
您的
get2Complement(char* complement)
函数会修改参数,但您在应用此操作后正在打印输入。要解决此问题,只需在执行操作之前移动那些 printf
线即可。
在减法中,您计算了
binary2
的补码,但忘记将 binary1
的补码相加。您可以通过在减法部分添加binary3和binary1 -> Add(binary1, binary3, result);
来解决这个问题。