Erklärung einer C funktion



  • Hallo,
    Habe eine Frage:

    Wie funktioniert folgende C Funktion?

    void test(unsigned long x[], unsigned long y[], unsigned long sum[])  
    {  
      unsigned long c, sum0;  
      sum0 = x[0]+y[0];  
      c = sum0<x[0];  
      sum[0] = sum0;  
      sum[1] = x[1]+y[1]+c;  
    }
    

    ok, sie erwartet als parameter mal drei unsigned long int arrays (gehe ich richtig der annahme dass unsinged long == unsigned long int ?
    dann wird in sum0 die summe von weweils ersten index von x und y gespeichert.
    was passiert aber in der nächsten zeile?
    also was macht carry = sum0<x[0]?
    das < zeichen hat irgendwas mit shift zu tun... kann mir das hier jemand erklären?

    mfg



  • Addiert zwei Doppelzahlen.
    Wenn bei s=x+y ein Überlauf auftrat, dann ist s<x und s<y. Damit wird also das Carry-Bit erzeugt.

    Haste dazu auch Multiplikation, Division und Modulus?



  • fractile schrieb:

    also was macht carry = sum0<x[0]?

    es macht

    if(sum0<x[0])
       carry=1;
    else
       carry=0;
    


  • hallo und danke für die antwort.
    kannst du das ein bisschen genauer erklären.
    also wieso addiert das zwei doppelzahlen? und was ist eine doppelzahl überhaupt?



  • fractile schrieb:

    hallo und danke für die antwort.
    kannst du das ein bisschen genauer erklären.
    also wieso addiert das zwei doppelzahlen? und was ist eine doppelzahl überhaupt?

    Mein unsigned long ist mal dezimal und vierstellig.

    1232 4576
    +
    5424 7342

    sum0=4576+7342
    also sum0=1918
    beachte, daß die führende 1 im Ergebnis abgeschnitten wurde. Ein Überlauf ist passiert.
    Das wird festgestellt mit
    if(1918<4576)
    c=1;

    sum[0]=1918
    sum[1]=1232+5424+1
    also
    sum[1]=6657

    also
    1232 4576
    +
    5424 7342

    6657 1918



  • fractile schrieb:

    gehe ich richtig der annahme dass unsinged long == unsigned long int ?

    Es kann das gleiche sein, muss es aber nicht. Das ist Systemabhängig.

    int ist der Standardtyp auf einem System. Auf 8 und 16-Bit Rechnern ist int i.A 16 Bit groß. long ist 32-Bit.

    Es gilt short <= int <= long.



  • DirkB schrieb:

    Es gilt short <= int <= long.

    und wo/wie gehört hier long int hinein?



  • DirkB schrieb:

    fractile schrieb:

    gehe ich richtig der annahme dass unsinged long == unsigned long int ?

    Es kann das gleiche sein, muss es aber nicht. Das ist Systemabhängig.

    int ist der Standardtyp auf einem System. Auf 8 und 16-Bit Rechnern ist int i.A 16 Bit groß. long ist 32-Bit.

    Es gilt short <= int <= long.

    Richtige Antwort, doch leider auf eine ganz andere Frage. 🤡



  • volkard schrieb:

    DirkB schrieb:

    fractile schrieb:

    gehe ich richtig der annahme dass unsinged long == unsigned long int ?

    Es kann das gleiche sein, muss es aber nicht. Das ist Systemabhängig.

    int ist der Standardtyp auf einem System. Auf 8 und 16-Bit Rechnern ist int i.A 16 Bit groß. long ist 32-Bit.

    Es gilt short <= int <= long.

    Richtige Antwort, doch leider auf eine ganz andere Frage. 🤡

    1. so gesehen ist ja immer jede Antwort richtig ...
    2. er hat ja auf die Frage geantwortet:

    DirkB schrieb:

    fractile schrieb:

    gehe ich richtig der annahme dass unsinged long == unsigned long int ?

    Es kann das gleiche sein, muss es aber nicht. Das ist Systemabhängig.

    nur ist diese Antwort meiner Meinung nach falsch ...



  • unsigned long ist dasselbe wie unsigned long int. Was DirkB meint ist dass int und long int nicht das gleiche sein müssen (aber können). Es ist also definiert dass long == long int ist, aber nicht in welchem Verhältnis long int zu int steht (es muss nur größer oder gleich sein)


Anmelden zum Antworten