【问题标题】:Overflow by converting hex to decimal manually in C#通过在 C# 中手动将十六进制转换为十进制来溢出
【发布时间】:2017-03-17 15:10:00
【问题描述】:

我的任务是编写一个程序,使用循环将十六进制整数转换为其十进制形式。不要使用内置的 .NET 功能。

我已经编写了程序,它适用于除“4ED528CBB4”之外的所有测试,并且在“D”之后溢出。结果我用long,找不到问题。

        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);
        }

    }

【问题讨论】:

  • 试试无符号整数
  • 将你所有的演员表从 (int) 更改为 (long),它对我有用。此外,您可能想在操作周围添加checked(),这将在溢出时引发异常(如果溢出足够多,它将再次变为正数,您甚至可能不会注意到它溢出):result += checked((13 * (long)Math.Pow(16, i)));。我只是简单地看了看,但看起来13 * (int)Math.Pow() 溢出了,int 的演员表没问题,但乘以 13 被推到了int 的限制之上。
  • 为答案而战。我添加了checked 并将所有内容更改为long,现在出现了溢出消息。如何解决这样的问题?
  • 您在同一字符串上收到错误,"4ED528CBB4"?您可能错过了(long) 转换。搜索“(int)”并确保替换所有这些。在我这样做之后,我得到了与here 相同的答案,没有任何例外。
  • 是的,我在第一种情况下漏掉了一个。现在它可以正常工作了。感谢您的帮助。

标签: c# hex decimal overflow


【解决方案1】:

如果您的reult 参数是long,您不应该在其中进行类型转换吗?

【讨论】:

    猜你喜欢
    • 2015-09-21
    • 2017-07-31
    • 2013-07-20
    • 2012-06-17
    • 2021-06-26
    • 1970-01-01
    • 2015-08-10
    • 1970-01-01
    • 2011-07-28
    相关资源
    最近更新 更多