Richtigen Datentyp anwenden



  • Hallo 🙂

    Woher weiss die CPU bzw. das System, welchen Datentyp er bei Daten anwenden muss wenn er Daten aus dem Arbeitsspeicher ladet (quasi int, char etc.) Diese Information wird ja nicht im Arbeitsspeicher mit hinterlegt. Oder passiert das während die CPU das Programm durchläuft und im Programm jeweils die Definition der Variable anschauet und somit den festgelegten Datentypen?

    Gruss,
    Kaioshin



  • Es gibt keine Datentypen auf Assembler/Binärebene. Wie Daten behandeln werden entscheidet die instruction. Es gibt instructions um 8 bit in ein Register zu laden, oder 16 bit, oder 32 bit, etc. Für floating point Operationen gibt es wiederrum extra Register und Instructions. (Edit: char ist auch nur eine (normalerweise 8 bit große) Zahl, falls dir das nicht klar war. Das Ausgabesystem guckt nur in einer Tabelle nach welches Bild bei welcher Zahl gemalt werden soll. Bilder sind auch nur Zahlen, die jedem Pixel einen Wert zuordnen, erst dein Bildschirm macht dann daraus etwas was man sehen kann.)



  • Hallo cooky451

    int i = 65;
    cout << i << endl;
    

    Trotzdem muss irgendwo festgelegt werden ob bei der Ausgabe von i nun 65 dargestellt wird oder das Zeichen A. Wie schaut es in diesem Falle aus?

    Danke für deine Antwort!



  • Oh, das hat nichts mit Instructions zu tun, das ist einfach nur eine Funktionsüberladung. Wie z.B. so was hier: https://ideone.com/MUnjpA

    #include <iostream>
    
    void foo(int)
    {
        std::cout << "int!" << '\n';
    }
    
    void foo(char)
    {
        std::cout << "char!" << '\n';
    }
    
    void foo(double)
    {
        std::cout << "double!" << '\n';
    }
    
    int main()
    {
        foo(static_cast<char>(65));
        foo(65);
        foo(65.77);
    }
    

    Der Compiler sucht beim Kompilieren einfach die (am besten) passende Funktion raus.



  • Diese Funktionsüberlagerung scheint sehr interessant zu sein. Möchte zu meiner Frage noch ein Konkretes Beispiel nehmen: Möchte man ein Memory Dump analysieren, ist es möglich die Werte ohne weitere Informationen als solche was diese beim laufenden Programm darstellen sollte, zu interpretieren? Erkenne ich im Dump welcher Datentyp angewendet werden muss und bis wo die Werte terminiert sind bzw. die auch einzelnen Objekte die im Speicher lagen etc. Wenn nein, wie macht das dann der Prozessor bzw. der Computer als Einheit?

    Vielen Dank für deine Erklärungen cooky!



  • Nein, du erkennst es nicht. Wie gesagt, wie die CPU die Daten behandelt hängt einfach von der Instruction ab. Da gibt's nicht viel mehr zu erklären als in der ersten Antwort steht. Vielleicht solltest du einfach mal nach einem Assembler Tutorial suchen, ich denke dann wird das klar.


  • Mod

    Kaioshin schrieb:

    Diese Funktionsüberlagerung scheint sehr interessant zu sein. Möchte zu meiner Frage noch ein Konkretes Beispiel nehmen: Möchte man ein Memory Dump analysieren, ist es möglich die Werte ohne weitere Informationen als solche was diese beim laufenden Programm darstellen sollte, zu interpretieren? Erkenne ich im Dump welcher Datentyp angewendet werden muss und bis wo die Werte terminiert sind bzw. die auch einzelnen Objekte die im Speicher lagen etc.

    Alles Nein*. Deswegen braucht man Debugsymbole, um solche Daten analysieren zu können.

    Wenn nein, wie macht das dann der Prozessor bzw. der Computer als Einheit?

    Gar nicht. Wurde doch schon erklärt, dass sie das gar nicht brauchen. Für den Computer ist alles Zahl. Eine Interpretation dieser Zahlen als irgendetwas Spezielles steckt quasi in der Logik der Programme selber. Beispiel: Für Daten, die als Fließkommazahlen gelten sollen, wird der Programmierer (oder heutzutage der Compiler, weil sich kaum jemand mehr mit solchen Details rumschlägt) Anweisungen erzeugt haben, die diese Daten in die Fließkommaeinheiten des Prozessors laden.

    *: Ein Spezialist kann einige Sachen schon erkennen. Einfache Sachen auch ein Laie. Man muss eben mit einem Ansatz daran gehen, wie die Daten interpretiert werden könnten. Da es auf der Welt nicht zu viele Formate gibt, ist das nicht so schwer. Man kann sich die Daten zum Beispiel mal als ASCII-Zeichen interpretiert ausgeben lassen. Wenn man dabei lesbare Passagen sieht, dann ist die Chance groß, dass das für das Programm eine Zeichenkette ist, denn andere Daten sähen üblicherweise wie Zeichensalat aus.



  • Kaioshin schrieb:

    Diese Funktionsüberlagerung scheint sehr interessant zu sein. Möchte zu meiner Frage noch ein Konkretes Beispiel nehmen: Möchte man ein Memory Dump analysieren, ist es möglich die Werte ohne weitere Informationen als solche was diese beim laufenden Programm darstellen sollte, zu interpretieren? Erkenne ich im Dump welcher Datentyp angewendet werden muss und bis wo die Werte terminiert sind bzw. die auch einzelnen Objekte die im Speicher lagen etc. Wenn nein, wie macht das dann der Prozessor bzw. der Computer als Einheit?

    Der Programmeinstieg ist hier entscheidend!

    Der Computer verarbeitet die Opcodes von Begin bis Ende in der richtigen Reihenfolge, daher weiß er entsprechende Daten die auf einen Opcode folgen können richtig zu interpretieren.
    Wenn du aber einen Memory Dump mitten drin nimmst hast du da praktisch keine Chance, weil du gar nicht weißt, wo ein Opcode anfängt, entsprechend kannst du nicht wissen, welche Bytes zu Opcodes gehören und welche zu Daten und wie eventuelle Daten zu interpretieren sind, weißt du noch weniger.

    Und wie Datentypen einer Hochsprache verarbeitet werden müssen, dass entscheidet erst einmal der Compiler, der setzt das ganze nämlich in Assembler und dieser dann in Opcodes oder von der Hochsprache direkt zu Opcodes um.


Anmelden zum Antworten