2015-05-26 164 views
15

有人可以幫助我在標準(C99和C++ 03)中識別下面的行會發生什麼?C/C++ Literals

uint16_t a = 5; 

因此,左側是類型化變量,右側是文字,何時以及如何獲得變量的文字類型?

上述賦值是否等同於下面的語句?

uint16_t a = (uint16_t)5; /* C */ 
uint16_t a = reinterpret_cast<uint16_t>(5); // C++ 

如何:

uint16_t a = 5u; 

然後,如果你有這樣的:

uint32_t b = a + 5; 

是上述等同於以下語句後面的語句?

uint32_t b = (uint32_t)(a + (uint16_t)(5)); /* C */ 
uint32_t b = reinterpret_cast<uint32_t>(a + reinterpret_cast<uint16_t>(5)); // C++ 

C11和C++ 14中的東西是否改變?另外,請假定系統int是32位。我一直在C編碼一段時間,但從來沒有真正深入瞭解它,但它總是困擾我,所以如果有人能幫我解決它,我將不勝感激。

謝謝...

(編輯:加入假設int是32位)

+6

那麼最後我們有一個標籤C和C++的問題,並且它確實**與兩者都有關聯: – Eregrith

+4

這將是'static_cast'而不是'reinterpret_cast'(僅用於涉及指針和引用的轉換)。 –

+0

'5'的類型爲'int','5u'的類型爲'unsigned int'。 – user3528438

回答

6

的規則是第一的RHS被評估,然後該值被轉換爲目標類型。特別是

uint32_t b = a + 5; 

相當於

uint32_t b = (uint32_t)((int)a + 5); 

如果uint16_t是窄型,比int窄。

C中的所有操作(以及我認爲也在C++中)至少爲int的整數等級。

+0

uint32_t a = 1.8 + 0.3;'也是一個很好的例子嗎? (由於在轉換爲整數類型時浮點數得到*截斷*,結果'2'表示在*被轉換之前,這些值被加* *) – usr2564301

+0

「int of rank」。字節是真正重要的內容。 – Malina

+0

@Jongware,當然,很好的例子。首先,右邊的表達式被評估爲'double',然後轉換爲'uint32_t' –