2011-08-17 49 views
0

在下面的代码中,我将一个二进制转换为十进制,然后打印对应的字符。从二进制字符串转换为十进制?

void convertToChar(int binaryChar[],int length) 
{ 
int multiplier = 0; 
int i; 
int sum = 0; 
for(i=length;i>=0;i++) 
{ 
    sum = sum + (binaryChar[i]*pow(2,multiplier)); 
    multiplier = multiplier + 1; 
} 
printf("\nThe character is: %c",sum); 
} 

的问题是在该行sum = sum + (binaryChar[i]*pow(2,multiplier));。它引发错误:从double'。请帮助warning: converting to INT”!

+1

时可以被截断(使用同一类型 - >用双) – cristian

+0

你从二进制字符串(如“1010101”)转换,对吧?我在问题标题中添加了“字符串”,因为这更好地描述了你想要做的事情。虽然实际上从二进制字符串转换为二进制。 –

+0

我不是从double转换为int我所有的数据类型都是整数 – station

回答

3

你为什么用pow来计算2的幂次?这太慢了。使用1 << p获得两个p的幂。例如,1 << 0会给1,1 << 1会给2,1 << 2会给4.这是由于比特移位操作的性质:一个比特左移相当于由2

另外相乘的,它看起来就像你在你的程序有一个无休止的循环:

for(i=length;i>=0;i++) 

如果length为> = 0,则循环永远不会终止。

这应该修复它:

for(i = length - 1; i>=0; i--) sum += (binaryChar[i]*(1 << multiplier++)); 
+0

实际上,循环**将**终止,但仅限于之后int类型已经绕到负数,在此之前该程序可能会打到无效的内存访问。:) – snap

1

pow的签名是:

double pow(double X, double Y); 

计算2 ^乘数使用:

1 << multiplier; 

就迅速提:

  • 你有一个无限循环
  • 如果你从另一个方向解析字符串哟你可以乘以两,所以你不需要multiplier变量。
  • 之后,很多问题,我甚至不知道int binaryChar[]是正确的。字符中的字母表示不同的类型(和代码)。

+0

不幸的是,这只是代码的许多问题之一 –

0

pow需要双打,并返回一倍。一个丑陋的解决方法是只使用强制

(int)pow(x, y) 

但在这个简单的程序,为什么不只是做自己的力量扩张,而不是调用战俘的?

0

的问题是,数据类型为INT的精度是作为双(函数pow返回双)因此binaryChar的值的精确度更小的[I]将是implizit转换为double ...等问题的行隐含如下所示:

sum = (double) sum + ((double) binaryChar[i] * pow((double)2, (double) multiplier)) 

为了摆脱你必须做一个明确的转换( 见Type Conversion)警告,例如:从双为int你的电话号码转换

sum = sum + (binaryChar[i] * ((int) pow(2, multiplier)); 
相关问题