2011-08-17 52 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)); 
相關問題