【发布时间】:2014-01-22 19:16:48
【问题描述】:
这段代码以更简单的方式举例说明了这个问题(抱歉,前面的代码太复杂了)。无论如何,请注意 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);
}
原始问题
只要小于 64 位,此 C 程序将计算与任何二进制输入等效的十进制数...我不明白为什么。任何帮助表示赞赏。
#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);
}
【问题讨论】:
-
您对程序的特定部分有疑问吗?
-
您是否尝试过在调试器中逐行执行代码?
-
2 的 64 次幂可以存储在整数变量中吗?我不太确定。
-
您的问题是“为什么这会起作用?”或“当输入大于 64 位时为什么会失败?” ?
-
我的问题是为什么任何大于 64 位的二进制输入都会失败。我的意思是,sum 变量是双倍的,GSL 幂函数返回一个双倍……什么给出?