- Akku Tests und Balkonkraftwerk Speicher    Werbung      
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 Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    937
    Abgesehen davon, dass der Controller gar nix rechnet, weil der Precompiler Deine Literale schon weit vorher auflöst und der Optimizer die Variablen wegen Nichtverwendung gleich wieder aus dem Code kickt:

    Warum probierst Du solche Dinge nicht einfach selber (in Terminal, Console, Simulator, Listing, auf dem PC, ...) aus? Wenn Du dann noch Fragen hast, …
    Geändert von Holomino (08.05.2020 um 15:40 Uhr)

  2. #2
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    Natürlich stehe die reellen Zahlen in den Bsp für mögliche Variablenwerte.
    Und warum das Rad neu erfinden...

    Interessant in diesem Zusammnehang;
    short Zahl = 32768; // Wert 32768 gespeichert
    Zahl++; // statt 32769, Wert -32767 gespeichert
    Quelle: http://www.c-howto.de/tutorial/varia.../ganze-zahlen/
    Geändert von frabe (08.05.2020 um 17:04 Uhr)
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  3. #3
    HaWe
    Gast
    das ist ja alles noch triviales Grundwissen - dazu gehört auch, was bei Überlauf passiert und dass die Nachkommastellen bei Integer-Division abgeschnitten werden Bild  

    holomino hat aber völlig Recht:
    du kannst dir alle deine Fragen selber beantworten, wenn du deine Rechnungen per Serial.println() zur Kontrolle ausgeben lässt.

    interessant wird es, wenn du mit
    char
    rechnest, denn auf AVRs entspricht
    char == int8_t (signed)
    aber auf ARM (SAM, SAMD) und ESPs ist
    char == uint8_t (unsigned) !!

    Außerdem unterscheidet sich der Wertebereich von int, short, long je nach der verwendeten MCU.

    Besser: <stdint.h> bzw. besser noch <inttypes.h> Datentypen verwenden (int8_t, uint8_t, int16_t, uint16_t, int32_t, uint32_t), denn die funktionieren plattformübergreifend identisch.
    Geändert von HaWe (08.05.2020 um 18:25 Uhr) Grund: typo

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    937
    Doch, letztlich musst Du en Detail das Rad für jede Plattform und jede Programmiersprache neu erfinden, weil sowohl Datentypen (int = 16 oder 32Bit) als auch das Verhalten der Bibliotheken (in C# ist ein int z.B. ein Objekt, das bei einem Overflow eine entsprechende Exception auslöst) unterschiedlich sein können. Auf anderen Systemen, als in Deinem Link angegeben, erfolgt der Überlauf z.B. schon bei 32767++.

    Wenn man also eine neue Plattform in Betrieb nimmt und keine Lust hat, Specs zu lesen, probiert man es aus.

  5. #5
    HaWe
    Gast
    Zitat Zitat von Holomino Beitrag anzeigen
    Doch, letztlich musst Du en Detail das Rad für jede Plattform und jede Programmiersprache neu erfinden, weil sowohl Datentypen (int = 16 oder 32Bit) als auch das Verhalten der Bibliotheken (in C# ist ein int z.B. ein Objekt, das bei einem Overflow eine entsprechende Exception auslöst) unterschiedlich sein können. Auf anderen Systemen, als in Deinem Link angegeben, erfolgt der Überlauf z.B. schon bei 32767++.

    Wenn man also eine neue Plattform in Betrieb nimmt und keine Lust hat, Specs zu lesen, probiert man es aus.
    nein, muss man nicht, wenn man <stdint.h> bzw. <inttypes.h> Datentypen verwendet, die gelten ja gerade plattformübergreifend.
    Im Gegensatz zu char, int, short, long etc.
    und wir reden ja über C/C++ hier im Arduino-Subforum, daher ist C# offtopic.

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    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 |

  7. #7
    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 Bild  
    Geändert von HaWe (09.05.2020 um 13:02 Uhr)

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.693
    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

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    148
    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 |

Ähnliche Themen

  1. Variable auf LCD ausgeben
    Von Haveaniceday im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 20.07.2017, 18:57
  2. 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, 15:09
  3. Komplexe Variable
    Von DanielSan im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 19.06.2011, 14:30
  4. if Variable > 1 then Variable + 1
    Von klaus1973 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 26.11.2005, 14:31
  5. Pin mit Variable vergleichen
    Von Kundesbanzler im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 23.02.2005, 14:58

Stichworte

Berechtigungen

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

    Werbung      12V Akku bauen