- 3D-Druck Einstieg und Tipps         
Ergebnis 1 bis 10 von 17

Thema: int Variable, Grenzbereiche

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    147
    Datentypen, ein spannendes und wirklich wichtiges Thema.
    So dumm war meine obige Frage gar nicht...
    Das es je nach Plattform unterschiedliche Ausprägungen gibt, beantwortet auch, warum so wenig dieser Grenzüberschreitungen im Netz steht.

    Im aktuellen Fall habe ich die Unsicherheit mit typecast beseitigt.
    Code:
    ...
    float PWMschritt = PWMbereich / FadeZeit;
    int PWMakt = (int)(AktZeit * PWMschritt + 0.5);
    ...
    Vielleicht kehre ich aber auch wieder zu <stdint.h> bzw. <inttypes.h> Datentypen zurück.
    Fand ich als Anfänger aber etwas unübersichtlicher (unleserlicher).

    DANKE für eure Inspirationen!!!
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    HaWe
    Gast
    Grundsätzlich sind die Phänomene wie Überlauf oder Nachkommastellen-Abschneiden bei integer-Division NICHT von der Bitbreite der Variablen abhängig, sie treten stattdessen IMMER auf.
    Deine Beispiele oben mit Bsp1-Bsp6 und mit deinem short Beispiel treten daher auch genauso auf, wenn du mit <stdint.h> bzw. <inttypes.h> Datentypen arbeitest - du kannst nur besser vorausplanen beim Programmieren
    Geändert von HaWe (09.05.2020 um 14:02 Uhr)

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.650
    Zitat Zitat von frabe Beitrag anzeigen
    Datentypen, ein spannendes und wirklich wichtiges Thema.
    So dumm war meine obige Frage gar nicht...
    Das es je nach Plattform unterschiedliche Ausprägungen gibt, beantwortet auch, warum so wenig dieser Grenzüberschreitungen im Netz steht.

    Im aktuellen Fall habe ich die Unsicherheit mit typecast beseitigt.
    Code:
    ...
    float PWMschritt = PWMbereich / FadeZeit;
    int PWMakt = (int)(AktZeit * PWMschritt + 0.5);
    ...
    Vielleicht kehre ich aber auch wieder zu <stdint.h> bzw. <inttypes.h> Datentypen zurück.
    Fand ich als Anfänger aber etwas unübersichtlicher (unleserlicher).

    DANKE für eure Inspirationen!!!
    Man findet schon was zum Thema Datentypen. Überlauf, Bitbreite etc. sind erste Grundlagen der Programmierung. Wer in Assembler bzw. mit Maschinensprache anfängt MUSS die Grundlagen lernen. Inkrementierung und Dekrementierung geht i.R. mit einem Überlauf eines Registers einher, das eine bestimmte Bitbreite hat. Ein 8Bit-Register hat 8 Bit. Das sind 256 mögliche Werte, von 0 bis 255. Das bedeutet, wenn in einem Register alle Bits gesetzt sind und eine Inkrementierung auf das Register stattfindet (80x86 bspw.: INC AL), dass das Register auf "0" springt, weil ein Überlauf stattfindet. Aber das ist nicht alles. Dazu kommt, dass beim Überlauf ein Überlauf-Bit (Carry-Flag) gesetzt wird. Es gibt weitere Befehle, die dieses Bit verrechnen können. ADC (80x86) steht zum Beispiel für Addition mit Carry. Auf diese Weise lässt sich, mit wenigen Bit eines Registers, mit riesigen Zahlen rechnen, die niemals in dieses Register vollständig hinein passen würden. Später gab es mathematische Coprozzessoren mit Registern die eine wesentlich größere Bitbreite hatten.

    In einer Hochsprache ist das aber eher unwichtig. Hier geht es mehr darum, die Grenzwerte der Datentypen zu kennen und sich innerhalb dieser zu bewegen. Für eine Berechnung eines Wertes brauche ich also den passenden Datentyp, wenn es keine Überraschungen geben soll.



    MfG

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    147
    Zitat Zitat von Moppi Beitrag anzeigen
    Wertes brauche ich also den passenden Datentyp, wenn es keine Überraschungen geben soll.
    DAS ist das A und O bei allen Deklarationen und Zwischenberechnungen - das Fazit - niemals zulassen das ungereimtheiten auftreten können.
    Nur ist es nict immer so leichte, besonders wenn man bestehende Codes anpasst oder anch langer Zeit mal wieder anderweitig verwenden möchte.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  5. #5
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    07.03.2011
    Beiträge
    1.899
    Zitat Zitat von frabe Beitrag anzeigen
    Nur ist es nict immer so leichte, besonders wenn man bestehende Codes anpasst oder anch langer Zeit mal wieder anderweitig verwenden möchte.
    Mit ein wenig Disziplin geht das schon. Das fängt damit an, daß man unsigned Typen vermeidet. Mathematisch machen sie keinen Sinn, eigentlich sind sie Bitfelder wie SFRs oder Bitsequenzen eines Übertragungsprotokolls. Darauf sollte man keine arithmetischen Operationen sondern nur logische Operatoren anwenden. Wenn man Werte daraus im Programm weiter verwenden will, sollte man sie so schnell wie möglich in Zahlen umwandeln. Man sollte generell mit Objekten, die keine Zahlen sind, nicht rechnen. Daher ist es auch unerheblich ob chars signed oder unsigned sind. 'a' + 'b' macht keinen Sinn, es mag zwar in C ein Ergebnis geben, in anderen Sprachen eher nicht. Die einzige arithmetische Operation die auf chars Sinn macht ist '0' + [0..9]. Sie liefert das Zeichen für die Ziffern 0 bis 9 und das unabhängig davon, ob chars signed oder unsigned sind oder der Zeichensatz ASCII oder EBCDIC ist. Wenn man aus Platz oder Geschwindigkeitsproblemen 8-Bit Variable für nötig hält, verwendet man int8_t. Will man auf allen Architekturen schnell sein, sollte man int_fast8_t verwenden.

    Ansonsten ist ein int immer mindestens 16 Bit. Wenn man portabel programmiert, verlässt man sich nicht auf das Verhalten bei einem Über oder Unterlauf. Man sollte also nicht davon ausgehen, daß 32767 + 1 = -32768 ist. Wenn man das so will, sollte man es explizit so programmieren. Dann läuft das Programm auch, auf einem System mit 32 oder 64 Bit Integer. Wenn man so programmiert, kommt man sogar mit den klassischen C-Typen int, long int (32 Bit) oder long long (64 Bit) aus. Besser lesbar sind sicher die Typen aus stdint.h wie int32_t und int64_t.

    Daß das geht, sieht man an vielen Programmen. Beim Umstieg von 32 auf 64 Bit mussten sie nur neu kompiliert und gegen die 64 Bit Library gelinkt werden. Wer aber trickst, Überläufe explizit einkalkuliert, Shifts verwendet statt zu teilen, oder zu addieren statt bitweise zu odern, hat da eher Schwierigkeiten.

    MfG Klebwax
    Strom fließt auch durch krumme Drähte !

Ähnliche Themen

  1. Variable auf LCD ausgeben
    Von Haveaniceday im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 20.07.2017, 19:57
  2. [ERLEDIGT] C++ Hinweis: variable 'pHelp' set but not used [-Wunused-but-set-variable]
    Von geWichtig im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 20.02.2017, 16:09
  3. Komplexe Variable
    Von DanielSan im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.06.2011, 15:30
  4. if Variable > 1 then Variable + 1
    Von klaus1973 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 26.11.2005, 15:31
  5. Pin mit Variable vergleichen
    Von Kundesbanzler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.02.2005, 15:58

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress