Grundrechenarten in C



  • Hi Leute!

    Zu den 4 Grundrechenarten bzw die 4 Grundrechenarten in C (z.B. in habe ich folgende Frage:

    Wie werden die Rechenarten (z.B. Division bzw. Multiplikation) in C realisiert?

    Wie kann man diese "nachbauen"?

    (Mir geht es nur um das Verständnis der Operation bzw wie diese intern aufgebaut sind)

    Danke



  • Addition und Subtraktion sind auf jeder noch so popeligen CPU in Hardware vorhanden.

    Wenn Division bzw. Multiplikation nicht in Hardware vorhanden sind musst du die nachbauen.

    Das wird durch schieben und addieren gemacht. Im Prinzip so, wie du es auch schriftlich machst.
    Allerdings alles im Dualsystem.



  • Angenommen ich möchte eine Division durchführen:

    5:2

    if(5>2) {

    if(5>(2*2) {

    if(5>(2*3) {

    } else {

    result=2

    }

    }

    }

    if(1>2) {
    } else {

    if((1*10)>2) {

    .
    .
    .

    if((1*10)=(2*5)) {

    result=result.5
    (2.5)

    }

    }

    }

    (fiktiver Code)


  • Mod

    Billy12345 schrieb:

    (fiktiver unlesbarer Code)

    Benutze Codetags! Unter dem Editfenster. Du kannst deinen Beitrag auch im Nachhinein noch editieren.



  • Soll die Diskussion hier oder in Mathe und Physik ( http://www.c-plusplus.net/forum/326923 ) geführt werden?

    Da wird ausgenutzt, dass das Dualsystem eine Stellenwertsystem ist und nur zwei Ziffern kennt.


  • Mod

    DirkB schrieb:

    Soll die Diskussion hier oder in Mathe und Physik ( http://www.c-plusplus.net/forum/326923 ) geführt werden?

    Ich würde eine Äußerung des TE abwarten, was er überhaupt genau wissen möchte. Derweil ist zumindest mir das absolut unklar. Geht es um Maschinencode? Wie arbeitet ein Prozessor? Wie funktioniert Rechnen?



  • SeppJ schrieb:

    DirkB schrieb:

    Soll die Diskussion hier oder in Mathe und Physik ( http://www.c-plusplus.net/forum/326923 ) geführt werden?

    Ich würde eine Äußerung des TE abwarten, was er überhaupt genau wissen möchte. Derweil ist zumindest mir das absolut unklar. Geht es um Maschinencode? Wie arbeitet ein Prozessor? Wie funktioniert Rechnen?

    Mir geht es darum wie z.B. die unten stehende C Anweisung (Division der Zahlen) intern bzw in der Programmiersprach C realisiert ist.

    int a=2;
    int b=3;
    int ergebnis=0;
    ergebnis=a/b;
    

    Danke


  • Mod

    Was meinst du mit intern? Die Sprache C ist eine Sprache, die Sprache selbst rechnet nicht. Es gibt Übersetzer (Compiler) für diese Sprache, die Übersetzer rechnen auch nicht. Ein Übersetzer nach x86-Assembler würde das nach

    movl	$2, -12(%rbp)
    	movl	$3, -8(%rbp)
    	movl	$0, -4(%rbp)
    	movl	-12(%rbp), %eax
    	cltd
    	idivl	-8(%rbp)
    	movl	%eax, -4(%rbp)
    

    oder ähnliches übersetzen. Das ist auch eine Sprache (x86-Assembler, hier in AT&T Syntax), die rechnet auch nichts. Diese Sprache kann man in die Maschinensprache eines x86-Prozessors übersetzen. Das kann ich nicht mehr zeigen, die menschenlesbare Variante davon wäre ein wilder Zeichensalat. Das ist auch eine Sprache, die rechnet auch nichts. Wenn man diese Übersetzung in den Instruktionsspeicher eines x86-Prozessors lädt, dann kann der das ausführen und man bekommt letztlich ein Ergebnis. Ist also die Frage wieder, wie ein Prozessor funktioniert? Wie man Assemblersprache spricht? Wie das Rechenwerk in einer CPU funktioniert? Wie ein Compiler funktioniert? Was willst du wissen? (Und was davon wird nicht im Lexikon erklärt?)
    Das ist das letzte Mal, dass ich mit Gegenfragen antworten werde. Stell konkrete Fragen, die das unnötig machen! Hier sind ja alle sehr hilfsbereit. Aber Hilfsbereitschaft heißt nicht, dass man Lust auf Ratespiele hat, weil du keine Lust hast, dich mal 2 Minuten hinzusetzen und eine klare Frage zu stellen.



  • Billy12345 schrieb:

    Mir geht es darum wie z.B. die unten stehende C Anweisung (Division der Zahlen) intern

    Das hängt vom Zielsystem ab. Hat das einen eingebauten Divisionsbefehl, dann so wie im Beispiel von SeppJ.
    Wenn nicht, dann ist der DIV-Befehl in einer (Assembler-)Unterfunktion.

    Billy12345 schrieb:

    bzw in der Programmiersprach C realisiert ist.

    So wie du es hingeschrieben hast.

    Ich nehme an, du willst wissen wie diese Unterfunktion funktioniert.
    Da schaust du am besten mal bei den Systemen vorbei, die keinen eingebauten DIV-Befehl haben.
    Das waren früher die Prozessoren in den Heimcomputern 6502 bzw Z80 und heute noch bei Mikrocontrollern: http://www-user.tu-chemnitz.de/~heha/Mikrocontroller/Division.htm

    Aber wie schon gesagt, ist das nicht anders als bei der schriftlichen Divison (Grundschule) im Dezimalsystem.

    Beim Dualsystem im Computer kann man allerdings noch ein paar Vereinfachungen machen.



  • SeppJ schrieb:

    .., die rechnet auch nichts. Diese Sprache kann man in die Maschinensprache eines x86-Prozessors übersetzen. Das kann ich nicht mehr zeigen, die menschenlesbare Variante davon wäre ein wilder Zeichensalat.

    Wie bitte ? Alle Maschinencodes kann man (notfalls) von Hand auch in einem Hexeditor eingeben. Was soll daran wild sein ?

    ; 9    : 	int a=2; 
    
      0001e	c7 45 f8 02 00
    	00 00		 mov	 DWORD PTR _a$[ebp], 2
    
    ; 10   : 	int b=3; 
    
      00025	c7 45 ec 03 00
    	00 00		 mov	 DWORD PTR _b$[ebp], 3
    
    ; 11   : 	int ergebnis=0; 
    
      0002c	c7 45 e0 00 00
    	00 00		 mov	 DWORD PTR _ergebnis$[ebp], 0
    
    ; 12   : 	ergebnis=a/b;
    
      00033	8b 45 f8	 mov	eax, DWORD PTR _a$[ebp]
      00036	99 		cdq
      00037	f7 7d ec	 idiv	DWORD PTR _b$[ebp]
      0003a	89 45 e0	 mov	DWORD PTR _ergebnis$[ebp], eax
    

    Kommentar: Nach dem Optimieren mit einem aktuellen Compiler bleibt von diesem Code fast nichts über, lediglich
    das bereits absehbare Ergebnis.


  • Mod

    merano schrieb:

    Wie bitte ? Alle Maschinencodes kann man (notfalls) von Hand auch in einem Hexeditor eingeben. Was soll daran wild sein ?

    Das ist nicht der Maschinencode, sondern eine Darstellung als Hexadezimalzahl für Menschen. Der Maschinencode selbst ist das, was du siehst, wenn du eine Executable am Bildschirm ausgibst. Wilder Zeichensalat.



  • Der Zeichensalat ist weiter weg vom Maschinencode als die Hex-Zahlen.



  • Sehe ich auch so.
    Am nächsten dran wäre wohl die Darstellung aus 0 und 1 (also als Bits).



  • SeppJ schrieb:

    Das ist nicht der Maschinencode, sondern eine Darstellung als Hexadezimalzahl für Menschen. Der Maschinencode selbst ist das, was du siehst, wenn du eine Executable am Bildschirm ausgibst. Wilder Zeichensalat.

    Was soll man von jmd. halten, der eine Binärdatei als Textdatei öffnet ?

    Das ganze ist ohnehin weit vom ursprünglichen Thema weg und der Fragesteller nicht mehr interessiert.


  • Mod

    Th69 schrieb:

    Sehe ich auch so.
    Am nächsten dran wäre wohl die Darstellung aus 0 und 1 (also als Bits).

    Was haben Bits damit zu tun? Entgegen landläufiger Meinung arbeiten Prozessoren nicht mit Bits. Bits sind ein Konstrukt aus der Informatik.



  • Und darum spricht man auch nicht von 8-Bit-, 16-Bit-, 32-Bit- oder 64-Bit-Architektur?

    Natürlich weiß ich, daß Prozessoren intern aus Transistoren und FlipFlops bestehen - letztere stellen aber das Äquivalent zu einem Bit dar.
    Und ein Prozessor-Befehl (Opcode) ist einfach ein Datenwort (bestehend aus mehreren Bits), s. Prozessor - Wortbreite.



  • Ich glaub SeppJ hat zuviele Trolle gefrühstückt.


  • Mod

    Th69 schrieb:

    Und darum spricht man auch nicht von 8-Bit-, 16-Bit-, 32-Bit- oder 64-Bit-Architektur?

    Weil sie diese Informationsmenge gleichzeitig verarbeiten können. Die Sprache der Maschine beruht aber nicht auf Bits sondern eben aus elektrischen Signalen. Und zwar immer gleich ganz viele auf einmal. Eine serielle Folge von Bitinformation ist die völlig falsche Vorstellung.


Anmelden zum Antworten