Unterschied zwischen Datentyp int und long auf Arduino

Ich habe gelernt, für einen Void-Hindernisroboter zu programmieren, aber als ich mir den anschaute Code Ich habe zwei Datentypen gesehen, die lang und int sind.

Int sind Datentypen, die -2.147.483.648 bis 2.147.483.647 enthalten. Long sind auch Datentypen, die -2.147.483.648 bis 2.147.483.647 enthalten.

Int und Long sind gleich, aber ich habe den Code gefunden, bei dem zwei Datentypen verwendet werden, wie unten dargestellt:

int trigPin = 2; int echoPin = 4; long duration, cm, inches; 

Aber wie können Sie wissen, wann welcher Datentyp verwendet werden soll? Ich habe viel im Web gesucht, aber ich habe es nicht verstanden, also kann mir das bitte jemand erklären.

Kommentare

  • “ Int sind Datentypen, die -2.147.483.648 bis 2.147.483.647 enthalten. “ Wo haben Sie das gehört?

Antwort

Auf dem Arduino (AVR-Modelle) beträgt eine int 16 Bit, nicht 32 Bit. Somit geht es von -32768 bis +32767.

Das ist anders von long, das sind 32 Bit.

Kommentare

  • Wie breit sind int und long auf den 32-Bit-ARM-Arduinos wie Due?
  • Ich denke auf dem Due, dass ein int ist 32 Bit, das gleiche a long. Siehe hier zum Beispiel.

Antwort

int in AVR GCC ist 16 Bits , nicht 32.

Antwort

Gemäß der C-Sprachspezifikation , int muss mindestens 16 Bit oder länger sein und long muss mindestens 32 Bit oder länger sein.

Für einen Compiler ist es in Ordnung, int als 32 Bit oder sogar 64 Bit zu implementieren. Für einen Compiler ist es in Ordnung, long als 64 Bit oder länger zu implementieren. Es ist einem Compiler jedoch nicht gestattet, long als 16 Bit zu implementieren.

Wann sollte also welcher Typ verwendet werden?

Wenn die Werte Sie arbeiten mit kann innerhalb von 16 Bit dargestellt werden, dann ist es in Ordnung, int zu verwenden. Wenn Sie mehr als 16 Bit benötigen, verwenden Sie long. Wenn Sie mehr als 32 Bit benötigen, verwenden Sie long long.

Lassen Sie sich nicht von Compiler- und / oder CPU-Besonderheiten einholen Für dieselbe Produktpalette, Arduinos, stehen 16- und 32-Bit-CPUs zur Verfügung. Vertrauen Sie stattdessen nur den Garantien des Standards.

Die vollständige Spezifikation der Typen in C lautet:

  • char muss mindestens 8 Bit
  • int muss mindestens 16 Bit
  • long muss mindestens 32 Bit

  • long long muss mindestens 64 Bit
  • Hinweis: Es ist für Compiler völlig legal, char, int, long und long long zu implementieren als 64 Bit. Dies ist in der Tat bei DSPs nicht ungewöhnlich.

    Kommentare

    • Außerdem: Lesen Sie die Compiler-Dokumentation
    • Und: sizeof(char) <= sizeof(int) <= sizeof(long) <= sizeof(long long) gemäß Standard. Wenn also int 64 Bit beträgt, muss long ebenfalls mindestens 64 Bit betragen.

Antwort

Dies ist die gleiche Argumentation wie in C: Die Größe des Typs int wird erwartet Um die natürliche Wortgröße zu sein, die Ihr System am effizientesten verarbeitet . Sie muss außerdem mindestens 16 Bit breit sein, nicht kleiner als eine short und nicht größer als eine long.

Eine int kann also 16-, 32- oder 64-Bit-basiert sein auf dem, was Ihr System am besten handhabt, und daher ist es höchstwahrscheinlich 16 Bit breit auf einer 8- oder 16-Bit-CPU, 32 auf einer 32-Bit-CPU usw.

Ich verwende int, wenn ich die beste Leistung erzielen möchte, während ich darauf achte, wenn ich mehr Reichweite als 16 Bit benötige. Heutzutage wissen Sie in der Regel, wann Sie Anwendungscode für 16-Bit-Systeme schreiben. obwohl das nicht so ist für „Bibliotheks“ -Code, wo Portabilität sein kann Größere Bedenken.

In Ihrem Beispiel erfordern die Variablen int unter der Annahme, dass der Autor ihre Typen sorgfältig ausgewählt hat, wahrscheinlich einen kleinen Bereich und könnten es sich leisten, eine Wortgröße zu haben Dies führt zu möglicherweise kürzerem oder schnellerem Code (oder beidem). Die long benötigten vermutlich einen Bereich von mehr als 16 Bit (sie sind garantiert mindestens 32 Bit breit). Auf dem Prozessor, den Sie als Kompilierungsziel ausgewählt haben, sieht es so aus, als ob int und long beide als 32-Bit implementiert wurden anders sein (oder sollte sein), wenn Sie eine 16-Bit-Ziel-CPU ausgewählt haben.

Antwort

Ich verwende gerne Typen aus stdint.h.

Obwohl sie geringfügige Nachteile haben, bieten sie den Vorteil, dass Sie genau wissen, welche Größe Sie verarbeiten, auch wenn Sie auf anderen Architekturen kompilieren.

#include <stdint.h> uint8_t my_byte = 0xf0; int16_t trig_pin = 2; int16_t echo_pin = 4; uint32_t duration, cm , blah; uint64_t big_int; // etc. 

Aber offensichtlich möchten Sie sich nicht um eine Reihe von int32_t bewegen, wenn Ihre Daten nur int16_t benötigen.

Kommentare

  • Verwenden Sie also kein Maschinenwort Größe hat keinen Einfluss auf die Leistung von AVR?
  • @Ren é – Im Allgemeinen kann die Nichtverwendung der Wortgröße die Leistung der meisten CPUs beeinträchtigen. Traditionell verfügen AVR-CPUs jedoch über 8-Bit-Register & Akkumulatoren mit 16-Bit-Anweisungen für Zeigeroperationen. Wenn ich also programmiere, wird der Code zuerst ausgeführt und dann auf Geschwindigkeit optimiert, wenn es ‚ ist zu langsam.
  • @Ren é – Aber wenn Sie wirklich pedantisch sein wollen, können Sie es verwenden word als Datentyp. Dies sind 16 Bit bei Arduino Uno und 32 Bit bei Arduino Due & Zero. Dies führt jedoch zu dem Problem zurück, wirklich nur die Mindestgröße Ihres Datentyps zu kennen. Angenommen, Sie verwenden word für einen Due-Code, möchten dann aber einen Backport auf Uno durchführen?! Die Verwendung von uint32_t würde dieses Problem lösen, bevor es gestartet wird, aber ja, die Wortgröße ist unter Uno nicht optimal. Was ist mit zukünftigen Arduino-Boards … welche Wortgröße werden sie haben? 32? 64? 128!?
  • OK. Ich würde also die Maschinenwortgröße verwenden (int? WORD scheint eine obselete Windows-Typdefinition zu sein), wenn die Untergrenze ausreicht. Die Speichergröße ist mir egal und ich brauche die Geschwindigkeit. * _T, wenn mir die Größe wichtig ist?
  • verschrottet das … gnu.org/software/libc/manual/html_node/Integers.html sagt *fast*_t scheint der richtige Weg zu sein …

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.