这段代码以更简单的方式举例说明了这个问题(对不起,上一个太复杂了)。无论如何,请注意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/