我有这个代码处理像“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的补码中的值。 如果我传递一个十六进制字符串,它应该是十进制的否定数字,我得不到正确的结果。
答案 0 :(得分:1)
如果您不处理减号,它将无法自行处理。
检查一下,记住你看过的事实。然后,在
最后,如果你看到'-'
作为第一个字符,则否定
结果。
其他要点:
pow
:它只是
每次都results = format * results + digit
。isdigit
和isalpha
(或islower
和
isupper
)为你进行角色检查。val -= '0'
(而不是48
)代表您
从字符代码转换为数字值。[i]
而不是at(i)
来阅读个人
字符。使用通常的开发选项进行编译,以及
如果发生错误,你会发生崩溃,而不是例外。从技术上讲,也不能保证按字母顺序排列
字符是有序的和相邻的。在实践中,我想你
可以指望'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位。