„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > Wöchentlicher Blog: Vier interessante Dinge, die mir diese Woche begegnet sind

Wöchentlicher Blog: Vier interessante Dinge, die mir diese Woche begegnet sind

Veröffentlicht am 08.11.2024
Durchsuche:879

1. Vermeidung verwirrender Dateinamen im VS-Code

Beim Schreiben von C-Dateien in VS-Code habe ich eine Datei zuerst.c.cpp genannt. Nach Abschluss des Programms sind bei der Ausführung Fehler aufgetreten. Nach 30 Minuten Fehlerbehebung entdeckte ich, dass das Problem im Dateinamen lag:
Die Erweiterung .c führte dazu, dass die IDE es fälschlicherweise als C-Programm identifizierte, was dazu führte, dass VS Code gcc (den C-Compiler) anstelle von g (den C-Compiler) verwendete, um meinen Code zu kompilieren.

Weekly Blog: Four Interesting Things I Encountered This Week

Bildunterschrift: Wie dumm!

  • Lösung: Ändern Sie in der Datei „tasks.json“ die „Befehlszeile“ von gcc in g.
  • Lektion gelernt: Verwenden Sie klare .cpp-Erweiterungen für C-Dateien, um unnötige Verwirrung zu vermeiden.

2. Javas plattformübergreifende Designphilosophie

Die Designphilosophie von Java unterscheidet sich erheblich von herkömmlichen kompilierten Sprachen:

Traditionelle Zusammenstellung:

  1. Sprachen wie C werden für bestimmte Zwecke direkt in Maschinencode kompiliert Plattformen (z. B. Windows, Mac, Linux)
  2. Die resultierenden ausführbaren Dateien (.exe) können nur auf der Zielplattform ausgeführt werden

Javas Ansatz:

  1. Der Compiler generiert Zwischencode (Bytecode)
  2. Dieser Bytecode kann auf jeder Plattform mit installierter Java Virtual Machine (JVM) ausgeführt werden
  3. Die JVM ist für die Übersetzung des Bytecodes in Maschinencode für die aktuelle Plattform verantwortlich

Dieses Design erreicht das Ziel „Einmal schreiben, überall ausführen“, wohingegen ausführbare C-Dateien (.exe-Dateien) auf die Ausführung auf einer einzigen Plattform beschränkt sind.

  • Vorteile: Das gleiche Programm kann ohne Änderung auf verschiedenen Computern ausgeführt werden

  • Nachteile: Der zusätzliche Schritt im Prozess kann die Kompilierung im Vergleich zu herkömmlichen Methoden etwas langsamer machen

Einmal schreiben, überall ausführen

                             ---------James Gosling

3. Zwei gängige Kompilierungsmodi

  • Der Debug-Modus ist auf das Debuggen ausgerichtet und weist weniger Optimierungen auf. Es wird hauptsächlich zum Debuggen von Programmen verwendet.
  • Der Release-Modus wird hauptsächlich zum Generieren der Release-Version verwendet, wobei der Schwerpunkt auf der Optimierung liegt und nur die grundlegende Debugging-Funktionalität beibehalten wird.

Weekly Blog: Four Interesting Things I Encountered This Week

4. Erzwungenes Typcasting aus einer Low-Level-Perspektive verstehen

Little Endian: Das niedrigstwertige Byte wird an der niedrigsten Adresse gespeichert. Diese Speichermethode wurde entwickelt, um das Lesen des CPU-Speichers zu erleichtern, das von niedrigen zu hohen Adressen erfolgt. Interessanterweise ist dies das Gegenteil davon, wie Menschen normalerweise Zahlen schreiben.
Zum Beispiel:
Die binäre Darstellung von 329933 ist 00000000 00000101 00001000 11001101
Little-Endian-Speicher: 11001101 00001000 00000101 00000000
Wie wir sehen können, kehrt Little Endian die Reihenfolge der Bytes in der Binärdarstellung um. Es ist jedoch wichtig zu beachten, dass die Bitreihenfolge innerhalb jedes Bytes unverändert bleibt!

Ein unterhaltsames Spiel zum Verständnis von Forced Type Casting

Mein Lieblingsexperiment zur Einführung von Type Casting!


# include int main() {     int a;     int *p;     a=329933;     p=&a;     char *q;     q=(char*)p;     printf("%d\n",*p);     printf("%d\n",*q); }
# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}
Ausgabe:


329933 -51
# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

Ich bin neugierig, warum es -51 ausgibt?

Erläuterung

    (char*)&a zeigt auf das erste Byte des int. Das erste Byte 11001101 wird als Zeichen interpretiert.
  1. Das höchste Bit 1 zeigt eine negative Zahl an. Nach der Zweierkomplementumwandlung erhalten wir -51 (Freunde, die mit dem Zweierkomplement vertraut sind, können überprüfen, ob es tatsächlich -51 darstellt)

Ist das ein Zufall? Versuchen wir es mit zwei weiteren Beispielen

printf("%d\n",*(q 1)); printf("%d\n",*(q 2));
# include 
int main()

{
    int a;

    int *p;

    a=329933;

    p=&a;

    char *q;

    q=(char*)p;

    printf("%d\n",*p);

    printf("%d\n",*q);

}

Probieren Sie es aus:

    Versuchen Sie, den oben genannten Code auszuführen und beobachten Sie die Ausgabe.
  1. Überlegen Sie, warum das zweite und dritte Byte eine solche Ausgabe erzeugen.
  2. Besprechen Sie dies gerne im Kommentarbereich.
  3. Können Sie eine erzwungene Typumwandlung auf andere Datentypen anwenden? Probieren Sie es aus!
Zusätzliche Informationen: Zweierkomplement

Bei der erzwungenen Typumwandlung zeigt (char)p auf die Adresse des ersten Bytes des Vier-Byte-Ints, also 11001101.

Die 1 ganz links stellt das negative Vorzeichen dar und zeigt an, dass es sich um eine negative Zahl handelt. Nach Anwendung des Zweierkomplements erhalten wir: 0110011 (die letzten 7 Bits)

(Hinweis: Bei positiven Zahlen ist das Zweierkomplement einfach die binäre Darstellung der Dezimalzahl. Bei negativen Zahlen wird das Zweierkomplement durch Invertieren aller Bits außer dem ganz linken (höchsten) Bit und anschließendes Addieren von 1 erhalten ganz rechts.)

Die Umrechnung in eine Dezimalzahl ergibt -51. Interessant, oder?

Vorteile des Zweierkomplements:

    Es ermöglicht die Berechnung sowohl positiver als auch ganzzahliger Typen nur mit einem Addierer, wodurch die Notwendigkeit eines Subtrahierers entfällt und der Hardwarebedarf vereinfacht wird.
  1. Es bietet eine eindeutige binäre Darstellung für Null. 10000000 steht nicht für -0, sondern für -128, während 00000000 für 0 und nicht für 0 steht.

Viele Leute fragen sich, warum es -128 ist. Wenn Sie die Antwort kennen, können Sie sie gerne im Kommentarbereich teilen. Dies wird nicht nur anderen helfen, sondern auch Ihnen helfen, Ihre Gedanken zu ordnen.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/stockdale_roger_999e292a7/weekly-blog-four-interesting-things-i-encountered-this-week-eo9?1 Bei Verstößen wenden Sie sich bitte an [email protected] um es zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3