2016-07-07 108 views
3

我有一些C++代码需要我在赋值语句中立即赋值。该代码使代码更难阅读,我希望有一种解决方法。必须赋值赋值

uint64_t shifted_val = (uint64_t)1 << 50; 

如果我写这篇文章的代码,而中投,shifted_val被设置为0,我想是因为它的治疗1直接作为32位值。有什么我失踪,以便我可以写这个没有铸造?

+4

写入'(1ull << 50)' –

+1

常量'1'的类型为'int'(不管它的位数是多少),所以'1 << 50'也是'int'类型。事实上'1 << 50'具有未定义的行为,除非'int'大于50位。 –

回答

5

一种方式来做到这一点是通过执行的习惯接收变量本身内的计算

uint64_t shifted_val = 1; 
shifted_val <<= 50; 

这将自然解决问题,无需使您可以将其他类型引用硬编码到表达式中(如类型转换或类型特定的后缀)。

+0

我认为这是最好的答案。 –

2

该常量需要被视为一个64位值,所以需要有某种方式来指定它。

你可以指定它为1ULL,它告诉编译器常量是unsigned long long,但是这可能不一定是64位,所以你最好使用演员来更便携。

+0

'1ull' **至少** 64位宽,这就是所需要的。 –

6

你可以这样做:

uint64_t shifted_val = 1ull << 50; 

如果你觉得语法还靠近,然后浇铸你可以这样做:

uint64_t a = 1; 
uint64_t shifted_val = a << 50; 
+0

括号是无害但不必要的。 –

+0

删除括号。 – PhotometricStereo