代码之家  ›  专栏  ›  技术社区  ›  Alejandro Trigo Rosón

如何处理高于7FF的十六进制值。。。64位和uint64\u t类型

  •  0
  • Alejandro Trigo Rosón  · 技术社区  · 8 年前

    由于我不是英国人,我想我可以用一段代码更好地说明这个问题:

       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\U t解决这个问题?

    2 回复  |  直到 8 年前
        1
  •  1
  •   Michaël Roy    8 年前

     uint64_t res = std::strtol(str.c_str(), NULL, 16);
    

    应为

     uint64_t res = std::strtoull(str.c_str(), NULL, 16);
    

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

        2
  •  1
  •   Uwe Kleine-König    8 年前

    (说到C,因为我对C++知之甚少。但我认为它仍然适用于C++。)

    strtol() 返回一个 int (顺便说一句,并非在所有平台上都是64位宽)。因此域是(假设64位宽 整数 INT_MIN , INT_MAX ]=[-0x80000000000000,0x7fffffffffffffffffff]因此无法返回0xcba321456789654a。

    在POSIX和C99中有一个函数 strtoull()

    另一种选择是

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