如何处理高于 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++ 字符串到整数转换例程的文档:

http://en.cppreference.com/w/cpp/string/byte/strtoul

(说说C,因为我对C++了解不多。但我想它仍然适用于C++。)

strtol() returns 一个 int(顺便说一句,并非所有平台上都是 64 位宽)。所以域是(假设 64 位宽 int)[INT_MININT_MAX] = [-0x8000000000000000,0x7ffffffffffffffff] 等 0xcba321456789654a 不能被 returned。

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

另一种选择是

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

.