我应该在后面的变量中在哪里使用 ULL?

问题描述

我试图解决一个关于 codeforces 的问题。我必须提供输入

1000000000 1000000000 1   

到这个代码

#include <iostream>
using namespace std;
int main()
{
long n,m,a;
cin >> n >> m >>a ;
long b,c;
b = (n%a==0)?(n/a):((n/a)+1);
c = (m%a==0)?(m/a):((m/a)+1);

unsigned long long  d ;
d = b*c  ;
cout<<d;

但它给了我错误

Diagnostics detected issues [cpp.clang++-diagnose]: p71.cpp:12:5: runtime error: signed 
integer overflow: 1000000000 * 1000000000 cannot be represented in type 'long'
SUMMARY: UndefinedBehaviorSanitizer: undefined-behavior p71.cpp:12:5 in

然后我知道我应该在数字文字添加 ULL 后缀。但是我应该如何在这种类型的代码中使用 ULL;

解决方法

我应该在哪里在 after 变量中使用 ULL?

不能在变量后使用 ULL。它是整数文字的后缀。您应该在您希望成为 unsigned long long 类型的整数文字之后使用 ULL,因为后缀就是这样做的。

所有整数类型都有上限(以及下限)。确切的最大值特定于每个系统,尽管语言标准确实指定了一个下限作为要求。如果您知道计算将超出特定类型的限制,则必须使用更大的类型。如果您不知道计算的最大结果,或者您知道它会超过最大整数类型的限制,那么您必须改变策略而不是使用普通整数类型:相反,您需要使用任意精度算术。

,

...我应该在后面的变量中在哪里使用 ULL?

ULL 不适用于变量。


= 左边的类型不影响右边的计算。

long b,c;
...
unsigned long long  d;
d = b*c; // long multiplication and long product.

要受益于 unsigned long long 的潜在扩展范围,请确保 long long 乘法。各种方法。

d = b; // in 2 steps
d *= c;

d = (long long) b * c;  // Cast

d = 1LL * b * c; // let compiler form effect code 

请注意,当 bc 为负时,上述第一个结果与第二个和第三个结果不同。