Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
二进制加法在c中,为什么会发生运行时错误?_C_Binary - Fatal编程技术网

二进制加法在c中,为什么会发生运行时错误?

二进制加法在c中,为什么会发生运行时错误?,c,binary,C,Binary,我正在尝试编写一个代码,它可以将2个十进制数0到1转换成二进制,然后将它们相加,并打印出2个初始数和最终和的二进制值。它编译没有问题,但是当我运行它时,它在转换和打印num1和num2(初始数字)后立即崩溃,我似乎找不到问题。 二元加法的一般公式为: *总和的第i位=二进制1的第i位+二进制2的第i位+进位系数(0或1) 如果sum>1,则在下一个运算中减去2并加1(这是我前面提到的进位因子) 下面是代码 #include <stdio.h> // Converting decim

我正在尝试编写一个代码,它可以将2个十进制数0到1转换成二进制,然后将它们相加,并打印出2个初始数和最终和的二进制值。它编译没有问题,但是当我运行它时,它在转换和打印num1和num2(初始数字)后立即崩溃,我似乎找不到问题。 二元加法的一般公式为:

*总和的第i位=二进制1的第i位+二进制2的第i位+进位系数(0或1)

如果sum>1,则在下一个运算中减去2并加1(这是我前面提到的进位因子)

下面是代码

#include <stdio.h>

// Converting decimal number to a binary number
void convertDecToBin(double num, int len, int binary[]) {

    // this function STORES conversion result in binary[]

    double tmp = num;
    binary[0] = 0;
    for (int i = 0; i < len; i++) {
        tmp *= 2;
        binary[i + 1] = tmp >= 1;
        if (tmp >= 1) {
            tmp -= 1;    
        }
    }

}


// Binary number addition
void addTwoBinary(int binary1[], int binary2[], int sum[]) {

    int tmp;
    int carry;

    for (unsigned int i = 20; i >= 0; i--) {
        if (i == 20 || tmp <= 1) {
            carry = 0;
        }
        else if (tmp > 1) {
            carry = 1;
        }
        sum[i] = binary1[i] + binary2[i] + carry;
        tmp = sum[i];
        if (sum[i] > 1) {
            sum[i]-=2;
        }
    }
}

//Printing the numbers
void PrintBinary(int binary[], int len) {
    for (unsigned int i = 0; i < len; i++) {
            printf("%d", binary[i]);

    }
}

int main(void) {

    double num1, num2;
    int binary1[30], binary2[30], sum[30];

    scanf("%lf", &num1);
    scanf("%lf", &num2);

    convertDecToBin(num1, 30, binary1);
    convertDecToBin(num2, 30, binary2);

    printf("num1 is ");
    PrintBinary(binary1, 21);
    printf("\nnum2 is ");
    PrintBinary(binary2, 21);

    addTwoBinary(binary1, binary2, sum);

    printf("\nsum is ");
    PrintBinary(sum, 21);

    return 0;
}
#包括
//将十进制数转换为二进制数
void convertDecToBin(双数值、整数len、整数二进制[]){
//此函数将转换结果存储为二进制[]
双tmp=num;
二进制[0]=0;
对于(int i=0;i=1;
如果(tmp>=1){
tmp-=1;
}
}
}
//二进制数加法
void addTwoBinary(int binary1[],int binary2[],int sum[]{
int tmp;
整数进位;
对于(无符号整数i=20;i>=0;i--){
如果(i==20 | | tmp 1){
进位=1;
}
和[i]=二进制1[i]+二进制2[i]+进位;
tmp=总和[i];
如果(总和[i]>1){
和[i]=2;
}
}
}
//打印号码
void PrintBinary(int binary[],int len){
for(无符号整数i=0;i
二进制[i+1]
将在最后一次迭代中访问
二进制[30]
,导致未定义的行为,因为有效位置为
0。。。29
for(unsigned int i=20;i>=0;i--){
这些循环是错误的。由于它是
无符号的
i>=0
永远不会是错误的,所以
i
0
处减少时将滚动到42亿,导致下一个
和[i]上出现未定义的行为
@Blaze谢谢!只需删除未签名的代码,代码就能正常工作。