【问题标题】:C++ ensuring arithmetic result involving literals is 64 bits not 32 bits [duplicate]C ++确保涉及文字的算术结果是64位而不是32位[重复]
【发布时间】:2020-09-03 14:33:54
【问题描述】:

我在过去将文字乘以 10 亿时遇到过问题,结果应该是 64 位,但由于存在文字而被转换为 32 位。

当乘以可能超过 2^32 的数字时,最佳(最安全和最简单)的做法是什么?

我有这个等式:

const uint64_t x = 1'000'000'000 * 60 * 5;

我选择了:

const uint64_t x = static_cast<uint64_t>(1'000'000'000) * 60 * 5;

这是应该怎么做的吗?只有一个被乘数需要转换为 64 位?

【问题讨论】:

  • ULL 附加到文字之一。
  • 有什么理由不使用1000000000ULL
  • @infixed 它的可读性远低于1'000'000'000ULL

标签: c++


【解决方案1】:

您可以在第一个文字上使用后缀来将其提升为正确的大小。在这种情况下,您可以使用

const uint64_t x = 1'000'000'000ull * 60 * 5;

使1'000'000'000 成为至少64 位宽的unsigned long long。这也有在乘法完成时将605 提升为unsigned long long 的效果。

【讨论】:

  • 我还有一个问题:const uint64_t x{ 1'000'000'000 * 60 * 5}; 如果卷曲比赛中的人数将超过uint64,编译器会发出警告或错误吗?在我看来,它可以静态推导出来
  • @KrzysztofMochocki 使用{} 确保如果此值不适合uint64_t,则代码不会编译。
  • @KrzysztofMochocki { 1'000'000'000 * 60 * 5} 将产生一个 int 因为这是所有操作数的类型。这意味着它会溢出。
  • @KrzysztofMochocki 它会编译,它很可能不会给你你想要的。
  • @KrzysztofMochocki 大括号中所有操作数的值为int,因此结果也将是int。使用花括号转换为uint64_t 只是确保此结果适合uint64_t 的任何类型。此编译,因为无论乘法是否溢出,该值都适合 64 位整数。如果您使用的是现代架构,int 很可能是 32 位,因此这种乘法可能会溢出。正确的做法是uint64_t{1000000000} * 60 * 5
猜你喜欢
  • 2012-10-20
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 2012-02-15
  • 1970-01-01
  • 2011-01-28
  • 1970-01-01
  • 2013-04-02
相关资源
最近更新 更多