2016-04-17 139 views
3

uint64_t x(1 << 35)给出的输出为0并带有警告。最适合初始化这些大值的是什么?如何在C++ 11中初始化uint64_t

+0

使用正确类型的文字,表达式'1ULL << 35'不会溢出,因为左侧是足够大的类型 –

+2

'(static_cast (1)<< 35)'? –

+1

在C++ 11及更高版本中,您还可以定义[新类型文字''](https://stackoverflow.com/questions/36406333/fixed-width-integer-literals-in-c),您可以用来避免这样的问题。 – mceo

回答

9

这是因为1 << 35是使用int的操作。如果你需要64位的类型,那么使用1ULL << 35来确保它是一个使用unsigned long long(保证至少为64位)的操作。

2

您遇到的问题是编译时间评估常量表达式1 < < 35是用int类型执行的。所以很可能你是这种类型的溢出,并且行为是未定义的!

最简单的解决方法是使用1ULL < < 35.无符号长long文字必须至少为64位。

4
auto x = std::uint64_t(1) << 35; 
1
uint64_t x = 1000000000ull; 

ULL马克值作为无符号长长

int64_t y = 1000000000ll; 

同样与正常长长

uint64_t x2 = (1ull << 35ull); 

只需在号码的末尾添加ULL