2012-11-26 44 views
1

如果得到了下面的代碼中的地方:什麼時候隱式類型轉換採取轉讓

uint8_t value = 0xF0; 
uint16_t shift = 0x10; 
uint32_t result = value << shift; 

cout << "The Result is: " << result << endl; 

我預計的輸出爲0,而是它是15728640.

我的問題

  • 是不是expresion評估=> 0並在那之後隱式轉換 爲結果的類型?
  • 這是行爲標準嗎?
  • 我在哪裏可以獲得有關這種行爲的更多信息?

回答

2

當您編寫value << shift時,value在轉換之前被隱式轉換爲int。這被稱爲「整數提升」。沒有其他規則適用於這種特殊情況。

整數升級適用於範圍在int範圍內的任何類型。如果它不適合int,則嘗試unsigned int。如果它不能兼容,那麼整數提升什麼也不做。

欲瞭解更多信息......以及我只是閱讀規範。

1

移位操作涉及到「整數提升」,這意味着將窄於int的類型轉換爲int。晉升是在輪班之前完成的,因此您所看到的行爲是預期的。

0

如果您使用的是32位或64位字的機器,則移位將位於32位或64位寄存器中。也就是說,8位「值」被加載到寄存器中,移位,然後(如果需要)截斷到最終變量。

這就是爲什麼「int」的長度取決於實現的原因。