我正在使用64位十六进制字符串,当我想在uint64_t中输入数字时,如果数字大于7f......它不会正确转换数字。 由于我不是英语,我想我可以用一段代码更好地展示问题:
void testing()
{
std::string str = "cba321456789654a";
uint64_t res = std::strtol(str.c_str(), NULL, 16);
cout << "RESULT " << std::hex << res << endl;
}
我得到的结果是:
RESULT 7fffffffffffffff
我是否必须将变量的类型更改为更大的 int?或者有办法用uit64_t解决这个问题?
您正在处理无符号,但使用的是字符串到签名的转换例程。 而且它没有转换为正确的类型。 STRTOL 转换为 32 位长。
uint64_t res = std::strtol(str.c_str(), NULL, 16);
应改为
uint64_t res = std::strtoull(str.c_str(), NULL, 16);
下面是指向 c++ 字符串到 int 转换例程文档的链接:
http://en.cppreference.com/w/cpp/string/byte/strtoul
(谈论C,因为我对C++了解不多。但我认为它仍然适用于C++。
strtol()
返回一个int
(顺便说一句,在所有平台上,它不是 64 位宽(。所以域是(假设 64 位宽的int
([INT_MIN
,INT_MAX
] = [-0x8000000000000000, 0x7fffffffffffffff],因此0xcba321456789654a不能返回。
在 POSIX 和 C99 中,有一个函数strtoull()
应该想要你想要,即返回一个无符号类型。
另一种选择是
sscanf("cba321456789654a", "%llx", &res);
.