如何处理高于 7FF.. 64 位和uint64_t类型的十六进制值



我正在使用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_MININT_MAX] = [-0x8000000000000000, 0x7fffffffffffffff],因此0xcba321456789654a不能返回。

在 POSIX 和 C99 中,有一个函数strtoull()应该想要你想要,即返回一个无符号类型。

另一种选择是

sscanf("cba321456789654a", "%llx", &res);

.

相关内容

  • 没有找到相关文章

最新更新