Frage zur Internen verarbeitung des Computers von Werten



  • Guten Morgen C++ Forum,
    ich habe eine eher generelle Frage wie der Computer im einzelnen Arbeitet.
    Wenn ich z.B. eine short variable mit der Größe 16 Bit definiere habe ich ja die möglichgkeit insgesamt 65536 (2^16) verschiedene Zahlen darzustellen.
    Da es Negative und Positive Zahlen gibt wird ein Bit als Vorzeichenbit reserviert ist es 1 ist die Zahl Negativ ist es 0 wird sie als Positiv angesehen,deshalb kann man nurnoch die hälfte der Zahlen darstellen(aber dafür Negativ und positiv).

    Nun zur eigentlichen Frage:
    Es gibt in C++ ja die möglichkeit einen Datentyp als unsigned zu definieren wodurch man zwar nurnoch positive Zahlen,dafür aber doppelt soviele darstellen kann.
    Wie händelt der Pc intern einen unsigned Typ?
    Es muss doch nach meinem Verständniss bei jeder Variablen ein Vorzeichenbit geben ,damit die CPU weiß ob der Wert negativ oder postiv ist?
    Wieso kann man dann bei der definition eines Typs als unsigned einfach alle Bits verwenden?
    Wenn das erste Bit auf 1 Steht müsste die CPU doch eigentlich denken,dass der Wert als Negativ behandelt werden muss oder etwa nicht?



  • Was ich auch nicht ganz verstanden hatte war:
    Wie unterscheidet der Pc zwischen Datentypen?
    Für den Computer ist ein Buchstabe (char) ja z.B. einfach nur ein ein Wert aus einsen und nullen in einem gewissen Speicherberreich.
    Woher weiß er,ob die nullen und einsen als dezimale Zahl,oder als Buchstabe interpretiert werden sollen?



  • signed ints werden üblicherweise in zweierkomplementdarstellung verwendet.
    das hat den riesenvorteil, daß mächtig viele befehle intern genau gleich funktionieren, egal ob man den int als signed oder unsigned ansieht.

    der computer macht das so, daß er zu addieren den assemblerbefehl ADD aufruft. kein unterschied, ob signed oder unsigned. haha, aber schon beim vergleichen gibts nen unterschied.
    vergleiche dazu die befehle JGE und JAE: http://vitaly_filatov.tripod.com/ng/asm/asm_000.41.html

    also ich als assembler-programmierer muss selber wissen, ob ich das bitmuster da als signed int oder als unsigned int ansehen wollte und den passenden befehl aufrufen. oder ich verwende eine hochsprache wie C, dann führt der compiler immer die info mit, welchen typ eine variable genau hat und kann dann aus >= den genau richtigen assembler-befehl generieren.

    bei der ausgabe ist es nicht anders. da muss ich die passende ausgabefunktion aufrufen. in C müßte ich dem printf-aufruf sogar mit %i oder so sagen, was er tun soll. in c++ würde man zum ausgeben << benutzen und der compiler sucht sich anhand des typs der variablen aus, welche ausgabefunktion er aufrufen soll.



  • Gibt es also auch Assembler Befehle um ein Bitmuster z.B. als ASCII Zeichen zu interpretieren,oder wie funktioniert das bei anderen Typen als Dezimalzahlen?



  • DerPCInteressierte schrieb:

    Gibt es also auch Assembler Befehle um ein Bitmuster z.B. als ASCII Zeichen zu interpretieren,oder wie funktioniert das bei anderen Typen als Dezimalzahlen?

    Wozu? Ist beim Vergleichen oder Addieren irgendwas anders?
    Und überhaupt, was für Dezimalzahlen? Dezimal ist allenfalls die Ein- und Ausgabe.



  • volkard schrieb:

    DerPCInteressierte schrieb:

    Gibt es also auch Assembler Befehle um ein Bitmuster z.B. als ASCII Zeichen zu interpretieren,oder wie funktioniert das bei anderen Typen als Dezimalzahlen?

    Wozu? Ist beim Vergleichen oder Addieren irgendwas anders?
    Und überhaupt, was für Dezimalzahlen? Dezimal ist allenfalls die Ein- und Ausgabe.

    Die Ausgabe meine ich damit ja auch wenn ich der Funktion cout << einen String übergebe woher weiß mein Programm jetzt ob das Bitmuster als String oder z.B. als Integer betrachtet werden soll?
    Klar definiere ich es mit String,aber wie läuft das im einzelnen ab.
    Wird dann bei der Ausführung von cout<<c(c ist ein Char Typ); gesagt gucke in die ASCII Tabelle was das Bitmuster an der Adresse von c für ein Zeichen ergibt und bei einem Int der in Dezimalform ausgegeben wird dann genauso,oder wie funktioniert das intern?


  • Mod

    DerPCInteressierte schrieb:

    Klar definiere ich es mit String,aber wie läuft das im einzelnen ab.
    Wird dann bei der Ausführung von cout<<c(c ist ein Char Typ); gesagt gucke in die ASCII Tabelle was das Bitmuster an der Adresse von c für ein Zeichen ergibt

    Ja, so ungefähr. Ganz früher war dies sogar exakt so. Heutzutage ist Schriftdarstellung etwas komplexer, wie du hoffentlich sehen kannst.

    und bei einem Int der in Dezimalform ausgegeben wird dann genauso,oder wie funktioniert das intern?

    Zuerst einmal muss ausgerechnet werden, aus welchen Ziffern die Ausgabe besteht, also die Zeichen, die ausgegeben werden sollen. Dann weiter so wie oben.



  • SeppJ schrieb:

    Zuerst einmal muss ausgerechnet werden, aus welchen Ziffern die Ausgabe besteht, also die Zeichen, die ausgegeben werden sollen. Dann weiter so wie oben.

    Das ist erstmal einleuchtend,aber mich würde wirklich interessieren wie die Umrechnung funktioniert.
    Die Zahl 5 z.B. dargestellt mit 8bit wäre ja 00 00 01 01 für die CPU dies wäre aber nicht die richtige Bitreihenfolge für die Ziffer 5 in der ASCII Tabelle.
    Nun frage ich mich wie macht die Funktion cout das umrechnen.
    Es ist ja lediglich zur Compile Zeit bekannt welchen Typ eine Variable hat der CPU ist das beim Rechnen (Bei der Laufzeit des Programmes)ja egal.
    Wird also schon beim Compilen der Funktion cout mitgeteilt,dass es sich hier um einen int,oder z.B. um einen String Typ handelt,oder woher weiß die Funktion als welchen Typ sie dieses Bitmuster betrachten soll?

    Ich meine ob das Bitmuster 00001101 jetzt als Zeichen,oder als Zahl ausgegeben werden soll ist zur Laufzeit für die Funktion cout ja garnicht festzustellen oder?



  • cout erhält ja auch nicht nur den Inhalt der Variable sondern auch deren Typ, via Funktionsüberladung. Abhängig vom Typ der Variablen ruft der compiler also eine unterschiedliche Version auf.


  • Mod

    Oder wenn dir Funktionsüberladung nichts sagt, dann kennst du vielleicht, wie das in C läuft. Beim printf muss man genau angeben, welche Art der Darstellung man für eine bestimmte Variable wünscht. Und wenn man dies falsch tut, dann kommt auch entsprechend irgendwelcher Müll raus, weil die Daten bei der Ausgabe falsch interpretiert werden. (Kann aber auch manchmal ganz nützlich sein, weil man sehr einfach den Zahlenwert eines Buchstabens ausgeben kann, eben indem man printf einfach anlügt und sagt, es wäre eine normale Zahl. In C++ müsste man dafür extra casten, um die passende Überladung zu wählen)



  • Hallo DerPCInteressierte,

    als Beispiel:

    int x = 65;
    printf("%d, %c", x, x);
    

    oder aber

    int x = 65;
    cout << x << ", " << char(x);
    

    Wenn du wissen willst, wie man selber die Ausgabe einer Dezimalzahl programmiert (bzw. wie obige Funktionen intern implementiert sind), dann schau z.B. mal in Converting numbers to strings and strings to numbers.


Anmelden zum Antworten