2017-12-27 1643 views
-1

现在,我有我怎样才能在没有警告的情况下设置一个很长的长号码?

long long x = 1 << 60; 
cout << x << endl; 

,我知道,很长很长的范围可以是一路攀升至2^64,但由于某些原因,当我执行一段代码,它给了我一个警告,说“left shift count >= width of type [-Wshift-count-overflow].

另外,0被打印到屏幕上,这显然不是我想要的。

我试图把文字“LL”之后,但我不知道我应该把它:

long long x = (1 << 60)ll; 
long long x = (1 << 60ll); 

和他们没有工作

任何人都可以请告诉我如何解决这个问题?提前致谢!

+1

使用正确的文本类型:http://en.cppreference.com/w/cpp/language/integer_literal –

+0

@NeilButterworth我试过了,但我应该把它放在60之后? 1之后?括号之后? –

+0

因为你似乎在随意地尝试一些事情,所以请注意,在(1 << 60)'中有** 3个**位置可以添加'll';你只试过其中两个。 –

回答

3

这是一个常见的错误期待这个表达式:

long long x = 1 << 60; 

这种类型的左侧会影响右侧的计算。它不是,1 << 60的结果转换为左边的类型,但它不影响1 << 60本身的计算。所以,正确的解决办法是改变的1类型:

long long x = static_cast<long long >(1) << 60; 

long long x = 1LL << 60; 

甚至

auto x = 1LL << 60; 
+0

哦,好的,非常感谢你! –

相关问题