void main(void)
{
unsigned char a=143, b=121;
unsigned long c;
c = a * 256 + b;
printf("\n\r143 * 256 + 121 = %ld", c);
}
當執行上述程式碼時,理論上輸出值應為 "143 * 256 + 121 = 36729",但是輸出的值卻為 "143 * 256 + 121 = -28807"。為什麼會如此呢?主要是因為 SDCC 在做型別轉換時出了點問題。如下所示:
- (int) (unsigned char) 143 * (int) 256 + (int) (unsigned char) 121=
- (int) 143 * (int) 256 + (int)121 =
- (int) 36729 = (int) 0x8F79 = (long) 0xFFFF8F79 = (long) -28807
- 因為 0x8F79 第一個 bit 為 1,所以被當成負數來處理。
void main(void)
{
unsigned char a=143, b=121;
unsigned long c;
c = a * 256L + b;
printf("\n\r143 * 256 + 121 = %ld", c);
}
只要改成上列程式就沒有問題了,原因如下:
- 運算式中若有使用混合的資料型別,編譯器在計算之前會先將變數轉換為相同的資料型別,其規則是將佔記憶空間較小的變數轉換成佔記憶空間較大的資料型別。
- SDCC 在處理四則運算處理時,都會先轉換成 int 型態來處理,最後再轉換成儲存型態。
- 所以當四則運算裏有 long 常數或變數時,全部數值都會轉換成 long 來處理。
張貼留言