2016-04-17 177 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