2014-11-25 38 views
0

我有一個項目,部分項目是將給定的0和1的字符串轉換爲小數。 (所以,將二進制轉換爲十進制,2-s和非2s恭維) 但是我遇到了一個奇怪的問題。 當我編譯和運行一個IDE,如Visual Studio和代碼塊的程序,輸出結果是正確的。 但是,當我使用Cygwin編譯並運行它時,或者在Linux機器上運行時,數字會變成兩倍。 並非所有人都來了兩次(就像乘以2)。 例如,8位2s恭維:1111 1111應該是十進制的-1,但是這個程序在運行到Linux機器時輸出-2。將2s恭維轉換爲小數。輸出是雙重

有沒有人有任何想法爲什麼會發生這種情況?

這裏是功能的代碼;

int convertToDecimal(string line) 
{ 
    int num = 0; 
    if (line[0] == '1') 
    { 
     for (int i = 0; i < line.length(); i++) 
     { 
      if (line[i] == '1') 
       line[i] = '0'; 
      else 
       line[i] = '1'; 
     } 
     for (int i = 0; i < line.length(); i++) 
     { 
      int j = line.length() - 1 - i; 
      if (line[j] == '1') 
       num = num + pow(2.0, double(i)); 
     } 
     num = -1 * (num + 1); 
     return num; 
    } 

    for (int i = 0; i < line.length(); i++) 
    { 
     int j = line.length() - 1 - i; 
     if (line[j] == '1') 
      num = num + 1 * pow(2, i); 
    } 
    return num; 
} 


The expected output should be and what i get with Codeblocks or Visual Studio: 
11111111111111111111111111111111 -1 
11111111111111111111111111111110 -2 
11111111111111111111111111111101 -3 
11111111111111111111111111111100 -4 
00000000000000000000000000001010 10 

What I get is when run into Cygwin or Linux machine: 
11111111111111111111111111111111 -2 
11111111111111111111111111111110 -4 
11111111111111111111111111111101 -6 
11111111111111111111111111111100 -8 
00000000000000000000000000001010 20 

任何幫助,非常感謝。爲什麼會發生,以及可能會解決的問題。 我從來沒有遇到過這樣的問題。我運行Cygwin CodeBlocks和VS到一個窗口8.1 此外,有沒有辦法在程序中寫入,以便它檢測到正在運行的機器?

+0

'-1' ='0b11111111','-2' ='0b11111110',如果有幫助。 'x * 2 == x << 1'技巧仍然適用,即使是負數。 – 2014-11-25 03:08:28

+0

順便說一句,'pow'是一個雙重功能,受限於雙打,如果你接近52位信息左右,這將是重要的。等於'pow(2,x)'的整數是'1 << x'。 – 2014-11-25 03:11:04

+0

你是說每次移位兩位? 是的,我知道乘以2與左移兩位是一樣的。 我的問題是,當我將它運行到兩個不同的地方時,爲什麼會得到兩個不同的結果? – user2512806 2014-11-25 03:11:06

回答

2

讀取二進制數的標準方法是從整數值0開始,對於讀取的每一位(從左到右),將當前值乘以2(即左移1位),然後添加讀取該位以獲取新值。例如:

輸入:01011

+---------+-----------+ 
| Char In | New Value | 
+---------+-----------+ 
| 0 |  0  | 
| 1 |  1  | 
| 0 |  2  | 
| 1 |  5  | 
| 1 | 11  | 
+---------+-----------+ 

如果你知道有一個領先的1值是被當作一個符號值,使用符號的整數運行值,作爲特殊情況設置到所有的(~0L或同等),如果第一個數字是1

輸入:101011

+---------+-----------+ 
| Char In | New Value | 
+---------+-----------+ 
| 1 | -1  | 
| 0 | -2  | 
| 1 | -3  | 
| 0 | -6  | 
| 1 | -11  | 
| 1 | -21  | 
+---------+-----------+ 

至於你的具體問題,除了計算補的很混亂的手段,您的代碼假設輸入字符串只組成的錯誤01個字符。其他任何字符都會被視爲0字符。所以如果有什麼東西在你的字符串的末尾添加一個額外的字符,那麼它會顯示爲這個錯誤。

我敢打賭,你調用這個函數的代碼並沒有對字符串進行清理,並且最後還有一個額外的字符(可能是\r或空格)。