【问题标题】:How to initialize uint64_t in C++11如何在 C++11 中初始化 uint64_t
【发布时间】:2016-04-17 17:51:53
【问题描述】:

uint64_t x(1 << 35) 将输出作为0 给出一个警告。什么最适合初始化如此大的值?

【问题讨论】:

  • 使用正确类型的字面量,1ULL << 35 表达式不会溢出,因为左侧是一个足够大的类型
  • (static_cast<uint64_t>(1) << 35) 怎么样?
  • 在C++11及以后也可以定义new literals for the types in <cstdint>来避免此类问题。

标签: c++ c++11


【解决方案1】:

这是因为1 << 35 是使用int 的操作。如果您想要 64 位类型,请使用 1ULL << 35 以确保它是使用 unsigned long long 的操作(保证至少为 64 位)。

【讨论】:

    【解决方案2】:
    auto x = std::uint64_t(1) << 35;
    

    【讨论】:

      【解决方案3】:

      您遇到的问题是编译时评估常量表达式 1

      最简单的解决方法是使用 1ULL

      【讨论】:

        【解决方案4】:
        uint64_t x = 1000000000ull;
        

        ull 将值标记为unsigned long long

        int64_t y = 1000000000ll;
        

        与普通的long long相同。

        uint64_t x2 = (1ull << 35ull);
        

        只需在号码末尾添加 ull

        【讨论】:

          猜你喜欢
          • 2020-02-08
          • 1970-01-01
          • 2018-10-11
          • 2012-06-12
          • 2014-04-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-12
          相关资源
          最近更新 更多