2013-02-03 43 views
2

我正在尋找一種將2個數字相乘的方法(兩位數) 我使用C編程並使用PIC18F4455芯片以及CCS編譯器。 繼承人的問題:8位系統上的2位數乘法

代碼:

#include<18F4455.h> 
    #fuses HS,NOWDT,NOPROTECT,NOLVP 
    #device ICD=TRUE 
    #use delay(clock=5000000) 
    #include<lcd.c> //LCD display source code 
    #include<kbd_xy.c> //keypad source code 
    void main(){ 
     char k; 
     // 
     //code to retrive keypad input and store in a and b values 
     // 
     unsigned long c; 
     unsigned int a=99; 
     unsigned int b=1; 
     while(b<99) 
     { 
      c=a*b; 
      printf(lcd_putc,"%Ld",c); 
      delay_ms(1000); 
      lcd_putc('\f'); 
     } 
    } 

的問題是,保存在c的數量不能超過256個,由於芯片是8位。 所以99 * 1給出099 99 * 2給出198但是99 * 3給出41注99 * 3 = 297這就是256 + 41等等......

我正在尋找更好的方法爲了得到真正的結果,他們將通過LCD顯示,所以如果我最終得到4個變量,每個變量都包含一個數字,那就OK了由我。 如果當我做99 * 3我得到這樣的C1 = 7 C2 = 9 C3 = 2和C4 = 0,多數民衆贊成真棒

+1

的問題並沒有多大意義。在C語言中,不管底層硬件是什麼,也不管C語言編譯器如何利用其功能,您必須能夠乘以99乘以99而不會出現任何問題。如果你的編譯器不是一個合規的C編譯器,那麼至少可以這麼說,並且告訴人們它與標準編譯器有什麼不同。 –

+0

順便說一句,如果你打印「long」,它應該是'%ld',而不是'%Ld'。在你的特殊情況下,它應該是'%lu',因爲它是'unsigned long'。 –

+0

我指定了編譯器,並聲明由於硬件限制,我只允許8位整數 – DarthSheldon

回答

2

我解決我自己的問題, 變量似乎默認 任何在CCS宣佈int編譯器是一個int8 所以補救辦法很簡單:

#include<18F4455.h> 
#fuses HS,NOWDT,NOPROTECT,NOLVP 
#device ICD=TRUE 
#use delay(clock=5000000) 
#include<lcd.c> //LCD display source code 
#include<kbd_xy.c> //keypad source code 
void main(){ 
    char k; 
    // 
    //code to retrive keypad input and store in a and b values 
    // 
    int16 c; 
    int16 a=99; 
    int16 b=1; 
    while(b<99) 
    { 
     c=a*b; 
     printf(lcd_putc,"%Ld",c); 
     delay_ms(1000); 
     lcd_putc('\f'); 
    } 

}

+0

我覺得自己很笨,希望其他人可以從我的論壇學習 – DarthSheldon

+0

我強烈建議你配置你的編譯器,以便默認情況下,純整數是16位,因爲這是每個C標準所需的最小大小,並且使用字符(int8's)或ints適合當前的任務。 –

+1

不要覺得不好,這看起來像一些平臺特定的廢話 – Mikhail