Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - Zum C-Control-I-Forum - Zum C-Control-II-Forum

Re: Falsches Ergebnis bei Division Kategorie: Programmierung C (von PeterS - 14.04.2006 15:07)
Als Antwort auf Falsches Ergebnis bei Division von Hannes - 13.04.2006 19:47
Ich nutze:
C-Control Pro Mega32, C-Control Pro Mega128
Hallo Hannes,

ich muÃ?te erst mal selber darauf kommen:

Bei der Division "b=a/10;", wird 10 als signed Datentyp angenommen. Und sind im Ausdruck signed und
unsigned gemischt, so hat signed Priorität. Es wird also eine signed Division durchgeführt.

Folgendes Programm zeigt dir richtigen Werte:

word a,b,c;
 
void main(void)
{
    c=10;
    for (a = 31000; a < 34000; a=a+100)
    {
        b = a/c;
        Msg_WriteWord(a);
        Msg_WriteChar(0x20);        // Leerzeichen
        Msg_WriteWord(b);
        Msg_WriteChar(0x0D);        // CR
        AbsDelay(200);
    }

    while(1);
}

Ich werde den Compiler so erweitern, daÃ? man numerische Konstanten explizit als unsigned definieren
kann.

Gruss Peter

> Hi,
>
> eine ganz einfache Rechnung aber leider falsch sobald der Dividend grö�er 32800 wird.
> Es ändert sich nichts wenn man den Datentyp von  word  auf  unsigned int  Ã¤ndert.
>
> Gruss
>
>
> Interpreter gestartet - 2kb RAM                                                
> 31000 3100                                                                      
> 31100 3110                                                                      
> 31200 3120                                                                      
> 31300 3130                                                                      
> 31400 3140                                                                      
> 31500 3150                                                                      
> 31600 3160                                                                      
> 31700 3170                                                                      
> 31800 3180                                                                      
> 31900 3190                                                                      
> 32000 3200                                                                      
> 32100 3210                                                                      
> 32200 3220                                                                      
> 32300 3230                                                                      
> 32400 3240                                                                      
> 32500 3250                                                                      
> 32600 3260                                                                      
> 32700 3270                                                                      
> 32800 62263                                                                    
> 32900 62273                                                                    
> 33000 62283                                                                    
> 33100 62293                                                                    
> 33200 62303                                                                    
> 33300 62313                                                                    
> 33400 62323                                                                    
> 33500 62333                                                                    
> 33600 62343                                                                    
> 33700 62353                                                                    
> 33800 62363                                                                    
> 33900 62373
> _____________________________________________________________
>
> word a,b;
>
> void main(void)
> {
>     for (a = 31000; a < 34000; a=a+100)
>     {
>         b = a/10;
>         Msg_WriteWord(a);
>         Msg_WriteChar(0x20);        // Leerzeichen
>         Msg_WriteWord(b);
>         Msg_WriteChar(0x0D);        // CR
>         AbsDelay(200);
>     }
>
>     while(1);
> }
>
>


    Antwort schreiben


Antworten:

Re: Falsches Ergebnis bei Division (von Joerg - 23.04.2010 13:16)
    Re: Falsches Ergebnis bei Division (von PeterS - 23.04.2010 14:28)