这段代码以更简单的方式举例说明了这个问题(对不起,上一个太复杂了)。无论如何,请注意out_b对于0到958之间的任何索引值都将正确打印。但是变量out_a始终将打印36893488147419103232。它们都是DOUBLE类型。看起来+操作弄乱了out_a的类型。即使附录的类型为DOUBLE,也无法使用。

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <string.h>

double main (int argc, char *argv[]) {

    char *wrapper = "11111111111111111111111111111111111111111111111111111111111111111"; // 65 digits
    int appendix = atoi(argv[1]);

    int length = strlen(wrapper);

    double out_a = gsl_pow_int(2,length) + appendix;
    double out_b = gsl_pow_int(2,length + appendix);

    printf("%.0lf %.0lf\n", out_a, out_b);
}


原始问题

这个C程序将计算等于任何二进制输入的十进制数,只要它小于64位...我看不出为什么。任何帮助表示赞赏。

#include <stdio.h>
#include <stdlib.h>
#include <gsl/gsl_math.h>
#include <string.h>

long double main (int argc, char *argv[]) {

    char *wrapper = argv[1];

    static int *array, length, llo, i;
    static long double sum;

    while ( *wrapper && ( *wrapper == '0' ) ) wrapper++;

    length = strlen(wrapper);
    llo = length - 1;

    array = malloc((length*sizeof(*array))+1);

    for ( i = 0; i < length; i++ ) {
        if ( wrapper[i] >= '0' && wrapper[i] <= '1' ) {
            array[i] = wrapper[llo-i] - 48;
            sum += array[i] * gsl_pow_int(2,i);
        }

        else printf("Some error.\n");
    }

    free(array);

    printf("%.0Lf\n", sum);

}

最佳答案

总体而言,您的代码还可以,但是:


main的返回类型应为int
真的不需要array
应该是if ( wrapper[llo-i] >= '0' && wrapper[llo-i] <= '1' ) {
sum初始化为0


参见:http://ideone.com/2ECduk

关于c - 似乎无法弄清楚这里发生了什么,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21268280/

10-11 05:38