我试图通过根据字段中的位置添加值,将8位数组转换为0-255之间的数字。
如果我使用
int array[8]={
0,1,1,0,0,0,0,1
};
int *p = array;
int i;
for (i = 0; i<8; i++){
if(p[i]!=0){
a = pow(2,i);
printf("%i\n",a);
}
};
我明白了:
2
4
128
作为结果,到目前为止是正确的。 但如果我使用
int array[8]={
0,1,1,0,0,0,0,1
};
int *p = array;
int i;
for (i = 0; i<8; i++){
if(p[i]!=0){
a = a + pow(2,i);
printf("%i\n",a);
}
};
我反而得到:
2686758
2686762
2686890
当我期待:
134
我做错了什么?
答案 0 :(得分:3)
您尚未将a
初始化为0。
以下内容应该有效
int array[8]={
0,1,1,0,0,0,0,1
};
int *p = array;
int i;
a = 0 // << Initialise a
for (i = 0; i<8; i++){
if(p[i]!=0){
a = a + pow(2,i);
printf("%i\n",a);
}
};
您始终需要为变量提供初始值。否则,您可以期望它们以任何值开头。
在第二段代码中,您正在累积a=a+pow(2,i)
,并且在第一次使用a
时,它将包含一些未确定的值。
答案 1 :(得分:1)
问题出在声明中:a = a + pow(2,1);
a
具有不确定的值,因为它尚未初始化并且您在算术运算中使用它。
答案 2 :(得分:1)
pow
旨在计算两个实数(非整数)值的指数函数。所以你可以用它来计算π 3/2 。这对于计算2的整数幂实际上并不理想。更简单和更快(尽管可能不太可读,直到你习惯它)是将2 i 写为(1UL << i)
。但是,在这种特殊情况下,您不需要其中任何一种。您可以执行以下操作:
int a = 0;
for (int index = 0, value = 1; index < 8; ++index, value *= 2)
if (p[i]) a += value;
甚至更直接
int a = 0;
for (int value = 1, *p = array; value < 256; value *= 2, ++p)
if (*p) a += value;
(如前所述,原文中的问题实际上并不是pow
的使用,而是缺少初始化int a = 0
。)
答案 3 :(得分:-1)
=0;
添加到int a;
初始化来修复它
坦克!