在C ++中将十六进制或十进制字符串转换为long long

时间:2013-09-25 16:11:34

标签: c++ binary hex long-integer

我有这个代码处理像“19485”或“10011010”或“AF294EC”这样的字符串......

long long toDecimalFromString(string value, Format format){
    long long dec = 0;
    for (int i = value.size() - 1; i >= 0; i--) {
        char ch = value.at(i);
        int val = int(ch);
        if (ch >= '0' && ch <= '9') {
            val = val - 48;
        } else {
            val = val - 55;
        }
        dec = dec + val * (long long)(pow((int) format, (value.size() - 1) - i));
    }
    return dec;
}

此代码适用于所有不在2的补码中的值。 如果我传递一个十六进制字符串,它应该是十进制的否定数字,我得不到正确的结果。

2 个答案:

答案 0 :(得分:1)

如果您不处理减号,它将无法自行处理。 检查一下,记住你看过的事实。然后,在 最后,如果你看到'-'作为第一个字符,则否定 结果。

其他要点:

  • 您不需要(也不想)使用pow:它只是 每次都results = format * results + digit
  • 您需要验证输入,确保数字 你获得的是合法的(并且你没有 其他奇怪的人物)。
  • 您还需要检查溢出。
  • 您应该使用isdigitisalpha(或islowerisupper)为你进行角色检查。
  • 您应该使用例如val -= '0'(而不是48)代表您 从字符代码转换为数字值。
  • 您应该使用[i]而不是at(i)来阅读个人 字符。使用通常的开发选项进行编译,以及 如果发生错误,你会发生崩溃,而不是例外。
  • 但你应该使用迭代器而不是索引 通过字符串。它更具惯用性。
  • 你几乎肯定会同时接受大写和小写 对于alphas,也可能会跳过前导空格。

从技术上讲,也不能保证按字母顺序排列 字符是有序的和相邻的。在实践中,我想你 可以指望'A'-'F'范围内的字符(或 'a'-'f',但是将字符转换为数字的最可靠方法 是使用表查找。

答案 1 :(得分:0)

您需要知道指定的数字是被解释为有符号还是无符号(换句话说,是“ffffffff”-1还是4294967295?)。 如果签名,则检测负数测试最重要的位。如果设置了ms位,那么在转换数字之后(生成无符号值)取1的补码(按位取反它然后加1)。

注意:要测试ms位,您不能只测试前导字符。如果数字是有符号的,那么“ff”应该是-1还是255?。您需要知道预期结果的大小(如果是32位且有符号,则“ffffffff”为负,或-1。但如果64位且有符号,“ffffffff”为正,或者为4294967295)。因此,有超过一个正确答案的例子“ffffffff”。

您可以测试无符号结果是否大于结果范围的“中间点”(例如,对于32位数字为2 ^ 31 -1),而不是测试ms位。