2016-07-07 132 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