如何处理高于 7FF 的十六进制值...64 位和 uint64_t 类型
how to deal with hex values higher than 7FF... 64 bits and uint64_t type
我正在使用 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);
这是一个 link 到 c++ 字符串到整数转换例程的文档:
(说说C,因为我对C++了解不多。但我想它仍然适用于C++。)
strtol()
returns 一个 int
(顺便说一句,并非所有平台上都是 64 位宽)。所以域是(假设 64 位宽 int
)[INT_MIN
,INT_MAX
] = [-0x8000000000000000,0x7ffffffffffffffff] 等 0xcba321456789654a 不能被 returned。
在 POSIX 和 C99 中有一个函数 strtoull()
应该是你想要的,即 return 一个无符号类型。
另一种选择是
sscanf("cba321456789654a", "%llx", &res);
.
我正在使用 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);
这是一个 link 到 c++ 字符串到整数转换例程的文档:
(说说C,因为我对C++了解不多。但我想它仍然适用于C++。)
strtol()
returns 一个 int
(顺便说一句,并非所有平台上都是 64 位宽)。所以域是(假设 64 位宽 int
)[INT_MIN
,INT_MAX
] = [-0x8000000000000000,0x7ffffffffffffffff] 等 0xcba321456789654a 不能被 returned。
在 POSIX 和 C99 中有一个函数 strtoull()
应该是你想要的,即 return 一个无符号类型。
另一种选择是
sscanf("cba321456789654a", "%llx", &res);
.