C++ C++;确保涉及文字的算术结果为64位而不是32位

C++ C++;确保涉及文字的算术结果为64位而不是32位,c++,C++,我在过去遇到过将文字乘以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; const uint64\u t x=静态(1'000'000'000)*60*

我在过去遇到过将文字乘以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;
const uint64\u t x=静态(1'000'000'000)*60*5;

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

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

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

使
1'000'000'000
成为至少64位宽的
unsigned long
。这也有助于在乘法完成时将
60
5
提升为
无符号长

ULL
附加到其中一个文本中。有任何不使用
1000000000ULL
的理由吗?@infixed它的可读性比
1000'000ULL
低得多。我还有一个问题:
const uint64_t x{1'000'000'000*60*5}如果卷发比赛中的人数超过uint64,编译器会发出警告或错误吗?在我看来,它可以是静态的deduced@KrzysztofMochocki使用
{}
可以确保如果此值不适合
uint64\t
@KrzysztofMochocki
{1'000'000*60*5}
将生成一个
int
,因为这是所有操作数的类型。这意味着它将溢出。@krzysztofmochoki它将编译,它很可能不会给您想要的。@krzysztofmochoki花括号中所有操作数的值都是
int
,因此结果也将是
int
。使用花括号将其转换为
uint64\u t
,只需确保该结果适用于任何类型的
uint64\u t
。这将进行编译,因为无论乘法是否溢出,该值都将适合64位整数<如果您使用的是现代体系结构,则code>int
很可能是32位,因此此乘法可能会溢出。正确的做法是
uint64{100000000}*60*5