Problematik "Schriftliche Division" 3. Klasse



  • Hallo zusammen,

    ich versuche gerade die Dezimalzahl 23 in eine Hexadezimalzahl umzuwandeln.

    Ich teile 23 erst einmal durch 16. Da kommt 1 Rest 7 heraus. Nun muss ich noch 1:16 teilen, doch meiner Ansicht nach, kommt da gar kein Rest heraus, denn das Ergebnis ist ja kleiner 1. Trotzdem muss irgendwie Rest 1 herauskommen, weil die hexadezimale Darstellung von 23 17 ist.

    Könnt ihr mir helfen? Wo kriege ich die 1 her?

    Danke euch.
    freakC++



  • 1:16 = 0 Rest 1.
    Da ist dein Rest. Und die 0 zeigt dir gleichzeitig, dass du fertig bist.



  • Wenn ich ganz systematisch schrtiftlich addiere, erkenne ich nicht, dass es einen Rest 1 gibt. Es kommt 0,0625 heraus.

    Zunächst hänge ich an die 1 zwei Nullen. In die 100 passt die 16 6mal herein. Es bleibt ein Rest von 4. Dann hole ich wieder eine 0 herunter. In die 40 passt die 16 2mal herein. Wo komme ich da auf Rest 1?

    edit: Wenn ich die Hexadezimalzahl 4AF in eine Binärzahl umrechnen soll, würdet ihr sie dann auch erst in eine Dezimalzahl umwandeln und dann in eine Dualzahl oder gibts einen direkten Weg

    edit edit: Ich hab eine Lösung. Ich wandle einfach jeden Nibble um und zack hab ich die Hexadezimalzahl.

    danke



  • Vergiss die „höhere“ Mathematik. Wie oft passt die 16 in die 23? Natürlich einmal. Dabei bleiben 7 übrig. Soviel hast du schon. Und wie oft passt die 16 in die 1? Offensichtlich gar nicht, also 0-mal. Übrig bleibt dabei ein Rest von 1. Das Nullenanhängen brauchst du nur dann, wenn du den exakten Wert haben möchtest.



  • freakC++ schrieb:

    Wenn ich ganz systematisch schrtiftlich addiere, erkenne ich nicht, dass es einen Rest 1 gibt. Es kommt 0,0625 heraus.

    Meinetwegen, es kommt 0,0625 raus.
    Also 1 geteilt dirch 16 ist 0 Rest 0,0625.
    Oder
    Also 1 geteilt dirch 16 ist 0 Rest ein Sechtehntel
    Oder
    Also 1 geteilt dirch 16 ist 0 Rest 1/16
    Oder
    Also 1 geteilt dirch 16 ist 0 Rest (Eins, was man nicht teilen konnte).

    Aber willen wie Bruchtahlen oder Kommazahlen benutzen? Nein.

    Also 1 geteilt dirch 16 ist 0 Rest 1.



  • mmh...das kann ich akzeptieren, doch ist es streng mathematisch richtig? Eigentlich nicht oder?



  • freakC++ schrieb:

    mmh...das kann ich akzeptieren, doch ist es streng mathematisch richtig? Eigentlich nicht oder?

    Klar ist das "richtig".

    Die verscheidenen Schreibweisen
    35:16=2R3
    35:16=2+3:16
    35:16=2+3/16
    35:16=2 3/16
    35:16=2+0.1875
    35:16=2.1875
    sind doch gar nicht widersprüchlich.



  • Dass deine Schreibweisen allesamt das Identische aussagen, ist mir klar. Doch ich wundere mich, dass "unser" Rest plötzlich ein anderer ist, als derjenige, den ich bei der schriftlichen Division herausbekomme.



  • freakC++ schrieb:

    Dass deine Schreibweisen allesamt das Identische aussagen, ist mir klar. Doch ich wundere mich, dass "unser" Rest plötzlich ein anderer ist, als derjenige, den ich bei der schriftlichen Division herausbekomme.

    Das kann nicht sein.

    freakC++ schrieb:

    Ich teile 23 erst einmal durch 16. Da kommt 1 Rest 7 heraus. Nun muss ich noch 1:16 teilen, doch meiner Ansicht nach, kommt da gar kein Rest heraus, denn das Ergebnis ist ja kleiner 1. Trotzdem muss irgendwie Rest 1 herauskommen, weil die hexadezimale Darstellung von 23 17 ist.

    23/16=1R7 (7 auf den Ergebniszettel geschrieben, mit 1 gehts weiter)
    1/16=0R1 (1 auf den Ergebniszettel geschrieben, mit 0 gehts weiter)
    0=> fertig.
    Von unten nach oben lesen: 17. Ist doch ok.



  • Auch wenn es auf den ersten Blick vielleicht nicht so toll aussieht, das Windowsprogramm debug (bis 32 Bit) hilft verstehen. Oder man versucht sich das ganze in Binär auszugeben und dann nach Hex. Wie auch immer, debug arbeitet standardmäßig mit Hexzahlen, daher konvertiere ich im Beispiel umgekehrt von Hex nach Dezimal.

    Noch kurz was zu den Debugeingaben: mit rax wird das AX Register geladen, mit rbx das BX Register, mit r kann man sich Register und Offsets usw. anzeigen lassen, mit a ruft man den asm-editor auf, mit d wird ein bestimmter Adressbereich gedumpt (hier, was im Stack ist), und mit t wie test kann man schrittweise durchs Programm steppen.
    Der Befehl div bx dividiert AX durch BX und speichert den Divisionsrest in DX.
    mit xor wird DX auf Null gesetzt, damit DX:AX bei der nächsten Division korrekt ist, und mit push wird der Rest in den Stackbereich geschrieben.

    C:\Users\nachtfeuer>debug
    -rax
    AX 0000  :17
    -rbx
    BX 0000  :a
    -a
    1B29:0100 div bx
    1B29:0102 push dx
    1B29:0103 xor dx,dx
    1B29:0105 jmp 100
    1B29:0107
    -r
    AX=0017 BX=000A CX=0000 DX=0000 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0100 NV UP EI PL ZR NA PE NC
    1B29:0100 F7F3              DIV     BX
    -t
    AX=0002 BX=000A CX=0000 DX=0003 SP=FFFE BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0102 NV UP EI PL ZR NA PE NC
    1B29:0102 52                PUSH    DX
    -t
    AX=0002 BX=000A CX=0000 DX=0003 SP=FFFC BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0103 NV UP EI PL ZR NA PE NC
    1B29:0103 31D2              XOR     DX,DX
    -d fffc
    1B29:FFF0                         -            03 00 00 00             ....
    -t
    AX=0002 BX=000A CX=0000 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0105 NV UP EI PL ZR NA PE NC
    1B29:0105 EBF9              JMP     0100
    -t
    AX=0002 BX=000A CX=0000 DX=0000 SP=FFFC BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0100 NV UP EI PL ZR NA PE NC
    1B29:0100 F7F3              DIV     BX
    -t
    AX=0000 BX=000A CX=0000 DX=0002 SP=FFFC BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0102 NV UP EI PL ZR NA PE NC
    1B29:0102 52                PUSH    DX
    -t
    AX=0000 BX=000A CX=0000 DX=0002 SP=FFFA BP=0000 SI=0000 DI=0000
    DS=1B29 ES=1B29 SS=1B29 CS=1B29 IP=0103 NV UP EI PL ZR NA PE NC
    1B29:0103 31D2              XOR     DX,DX
    -d fffa
    1B29:FFF0                         -      02 00 03 00 00 00           ......
    -
    

Anmelden zum Antworten