【发布时间】:2019-09-22 01:47:55
【问题描述】:
我正在尝试使用 long long 数据类型计算大整数,但是当它变得足够大 (2^55) 时,算术行为是不可预测的。我在 Microsoft Visual Studio 2017 工作。
在第一种情况下,我在初始化中从long long 变量m 中减去2。这适用于所有n,直到我尝试54,然后m 将不会被2 减去。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define LL long long
int main()
{
LL n;
cin >> n;
LL m = pow(2, n + 1) - 2;
cout << m;
return 0;
}
但是,使用此代码 m 确实会减去 2 并且可以正常工作。
#include <iostream>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;
#define LL long long
int main()
{
LL n;
cin >> n;
LL m = pow(2, n + 1);
m -= 2;
cout << m;
return 0;
}
我希望两个代码是等效的,为什么不是这样?
【问题讨论】:
-
我很好奇你在哪里找到
#define LL long long。我经常在这个网站上看到它,但我不知道是谁或什么在传播它。编辑:这是另一种代码高尔夫习惯吗? -
@Lucas 但
using LL = long long也是编译时间,输入大小相同,而且更好。没有理由在那里使用宏 -
@pipe:我们完全理解为什么。我们不想仅仅因为您认为代码示例“非常好”而推广不良做法。这个网站上有很多被
using namespace std;破坏的代码示例 -
@ThomasMatthews 当你告诉人们更喜欢 有符号 整数类型的位移时,请提醒他们,有符号整数类型溢出是未定义的行为 i>,这不仅仅是理论上的未定义行为,而且会在常见的编译器(如
gcc)上产生实际的错误,并且如果你没有有意识地考虑溢出,即使它被编译为行为,数值结果也会令人惊讶和意外完全符合固定宽度整数类型的预期。
标签: c++ floating-point precision long-long