2016-11-03 8 views
0

私の仕事は16進整数を小数点に変換するループを使用してプログラムを書くことです。組み込みの.NET機能を使用しないでください。Cで手動で16進数に16進数を変換することによるオーバーフロー

"4ED528CBB4"以外のすべてのテストで動作し、 "D"の後にオーバーフローします。私は結果のために長い時間を使用し、私は問題を見つけることができません。

 string hexadecimal = Console.ReadLine(); 
     long result = 0; 

      for (int i = 0; i < hexadecimal.Length; i++) 
      { 

       if (hexadecimal[hexadecimal.Length - i - 1] >= '0' && hexadecimal[hexadecimal.Length - i - 1] <= '9') 
       { 
        result += ((hexadecimal[hexadecimal.Length - i - 1] - '0') * (int)Math.Pow(16, i)); 
       } 
       else if (hexadecimal[hexadecimal.Length - i - 1] == 'D') 
       { 
        result += (13 * (int)Math.Pow(16, i)); 
       } 
       else if (hexadecimal[hexadecimal.Length - i - 1] == 'C') 
       { 
        result += (12 * (int)Math.Pow(16, i)); 
       } 
       else if (hexadecimal[hexadecimal.Length - i - 1] == 'A') 
       { 
        result += (10 * (int)Math.Pow(16, i)); 
       } 
       else if (hexadecimal[hexadecimal.Length - i - 1] == 'B') 
       { 
        result += (11 * (int)Math.Pow(16, i)); 
       } 
       else if (hexadecimal[hexadecimal.Length - i - 1] == 'F') 
       { 
        result += (15 * (int)Math.Pow(16, i)); 
       } 
       else if (hexadecimal[hexadecimal.Length - i - 1] == 'E') 
       { 
        result += (14 * (int)Math.Pow(16, i)); 
       } 

      } 
      Console.WriteLine(result); 
     } 

    } 
+0

符号なし整数 – jdweng

+0

を試してください。あなたのすべてのキャストを '(int)'から '(long)'に変更してください。また、オーバーフロー時に例外をスローする操作の周りに 'checked()'を追加したいかもしれません(十分オーバーフローして再び正になり、あふれていることに気付かないかもしれません):result + = checked((13 * (long)Math.Pow(16、i))); '。私はちょっとだけ見ましたが、 'int *'へのキャストはOKになりましたが、 '13 *(int)Math.Pow()'のように見えました。 – Quantic

+0

答えのためのタンク。私は 'checked'を追加し、すべてを' long 'に変更しました。そして、オーバーフローメッセージがあります。どのようにしてこのような問題を解決できますか? – Mina

答えて

0

あなたreultパラメータがlongある場合は、その中で型キャストを行うべきではありませんか?

関連する問題