- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: int Variable, Grenzbereiche

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    140

    int Variable, Grenzbereiche

    Anzeige

    Praxistest und DIY Projekte
    Hallo - folgend mal wieder Basiswissen;
    Was passierte wenn Variablen "unbeabsichtigt" über ihr Grenzbereiche hinaus laufen?

    int Bsp1 = 1/2; // wird 0 gespeichert und der Dezimalwert ignoriert?
    int Bsp2 = 3/2; // wird 1 gespeichert und der Dezimalwert ignoriert?
    unsigned int Bsp3 = 1-2; // wird 1 gespeichert und das Minus ignoriert?
    unsigned int Bsp4 = 2-5; // wird 3 gespeichert und das Minus ignoriert?

    Was ist wenn solche Fehler innerhalb einer Formal "unbeabsichtigt" vorkommen, das Endergebnis aber eine korrekten int Var. ergibt?

    int Bsp5 = 3/2*2; // wir 3 gespeichert?
    unsigned int Bsp6 = 1-2+10; // wird 9 gespeichert?

    PS: Mir ist bewusst, dass man die oberen Bsp generell mit "float" und ohne "unsigned" umgehen kann.
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    896
    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 16:40 Uhr)

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    07.06.2019
    Beiträge
    140
    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 18:04 Uhr)
    __________________________________________________ _
    | Sprache: C | Teensy 3.2 | Arduino 2.x | Status: EwigerAnfaenger |

  4. #4
    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

    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 19:25 Uhr) Grund: typo

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    896
    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.

  6. #6
    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.

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

  8. #8
    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)

  9. #9
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    int Bsp5 = 3/2*2; // wir 3 gespeichert?
    Sicher? Sollte 2 sein, nicht 3.

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    07.04.2015
    Beiträge
    896
    Zitat Zitat von Sisor Beitrag anzeigen
    Sicher? Sollte 2 sein, nicht 3.
    Vorsicht!
    Die Auflösung des Literals wird vom Precompiler übernommen.
    Für das Fragment:
    int main (void)
    {

    int8_t test = 3.1415/2 *2;
    if (test == 3)
    SetLED2();

    bekomme ich vom Compiler im AVR-GCC weder eine Warnung, noch einen Fehler. Im Listing sehe ich aber:

    000028b6 <main>:
    static inline void SetLED2()
    {
    PORTD.OUTSET = 0x02; }
    28b6: c0 e6 ldi r28, 0x60 ; 96
    28b8: d6 e0 ldi r29, 0x06 ; 6
    28ba: 12 e0 ldi r17, 0x02 ; 2
    28bc: 1d 83 std Y+5, r17 ; 0x05

    Da wird also weder eine Variable angelegt, noch im ganzzahligen Bereich, wie auf der eigentlichen Maschine, gerechnet.
    Insofern sind die oben angegebenen Beispielzeilen nicht wirklich tauglich, die Sache zu durchschauen.

    Besser (so, wie erwartet) wird's mit:
    int main (void)
    {
    int8_t test = 3.1415;
    test/=2;
    test*=2;
    if (test == 3)
    SetLED2();

    Hier castet sich der fraktale Anteil im Precompiler weg:
    test = 3.1415 ->3
    test /= 2 ->1
    test *= 2 ->2

    Es wird vom Compiler im Listing zwar immer noch keine Variable angelegt, aber der Aufruf von SetLED2() kommt auch nicht mehr.
    Geändert von Holomino (09.05.2020 um 16:43 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ä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
  •  

12V Akku bauen