问题描述
我试图解决一个关于 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
请注意,当 b
或 c
为负时,上述第一个结果与第二个和第三个结果不同。