2014-02-06 27 views
0

我在查找二進制算術期間正確處理變量的信息時遇到了問題。我目前正在Atmel ATTiny84微控制器上實現一種算法。我用C++編寫它。微控制器上的二進制算術

我遇到的問題是,使用二進制算術可能會導致溢出,或者最終的可變大小大於存儲在其中的值。我很抱歉,如果這是令人困惑的讓我解釋一個例子。

uint16_t A=500; 
uint8_t B=8; 
uint32_t C; 

C=A*B; 

從我通過谷歌搜索瞭解到,如果通過大小的可變尺寸乘以M的變量N它導致的大小爲M + N的變量。在上述情況下,C = 4000,但M + N是24.然而,值4000可以適合16位。我可以簡單地將C聲明爲16位還是必須如上所示爲32位?

uint16_t A=500; 
uint8_t B=8; 
uint16_t C; 
C=A*B; 

如果我必須存放4000的變量,它是32位的,我可以簡單地把它轉移到一個變量,它是由以下

uint16_t D; 
uint32_t C 
C=4000; 
D=C; 

感謝16位在您的幫助。

回答

0

乘法不會返回比兩個操作數更大的類型,除非您明確告訴它。該操作會將所有變量轉換爲最大寬度,然後相乘。當你用8位int乘16位int時,8位int將被轉換爲16位int,然後兩者相乘。雖然數學上的結果可能大於16位,但操作只會返回一個16位數字。如果結果不能放在16位空間中,則會設置溢出標誌(請檢查您的微控制器手冊以瞭解如何檢查)。

在你的情況下,操作將返回4000,它可以存儲在一個16位的變量,所以這很好。

-1
uint16_t A=500; 
uint8_t B=8; 
uint32_t C; 

C=A*B; 

它會促進A和B的大小,然後做數學。

uint16_t A=500; 
uint8_t B=8; 
uint16_t C; 
C=A*B; 

它會促進A和B的大小,然後做數學。

uint16_t D; 
uint32_t C; 
C=4000; 
D=C; 

您可能會或可能不會得到你正在試圖推32位的警告,到16

D=(uint16_t)C; 

將剪掉的低16位,而不警告。這兩種情況導致低16位進入D.